Muat naik fail tutorial asas pembangunan PHP
1. Muat naik fail PHP
Kami sering menghadapi banyak situasi seperti ini dalam penggunaan harian kami:
-
Muat naik gambar dalam ruang QQ
Muat naik gambar dalam WeChat Moments
Hantar e-mel dan muat naik lampiran e-mel
Diperlukan untuk memuat naik foto atau kad pengenalan semasa pengesahan
Terdapat juga pelbagai tuntutan yang dikemukakan oleh gou (gou) untuk menganalisis dan memuat naik perkara yang berbeza.
Kita perlu merealisasikan keperluan yang dikemukakan oleh produk Wang.
Memuat naik fail ialah salah satu kemahiran penting untuk pengaturcara PHP.
Dengan mempelajari muat naik fail, anda akan melihat intipati muat naik fail melalui fenomena penggunaan!
2 Perhatikan fail php.ini semasa memuat naik fail
Sebelum kami menerangkan secara rasmi muat naik bab ini, perkara pertama yang perlu kita lakukan ialah Beri perhatian kepada fail php.ini.
Buat pertama kali, kami diperkenalkan dengan cara mengubah suai fail php.ini Jika item konfigurasi anda tidak konsisten dengan apa yang kami katakan, sila beri perhatian kepada pengubahsuaian.
Mari kita fahami setiap item konfigurasi.
Mari kita lihat cara mengubah suai php.ini.
Buka fail konfigurasi php.ini dalam phpstudy.
Terdapat terlalu banyak fail php.ini Jika anda tidak menemuinya, anda boleh menggunakan ctrl+f untuk mencari item konfigurasi yang berkaitan.
Saiz yang disyorkan: saiz_fail < ; post_max_size < memory_limit
Selain itu, anda perlu memberi perhatian kepada masa pelaksanaan skrip.
max_execution_time, unit parameter ini ialah saat.
Parameter ini adalah untuk menetapkan masa pelaksanaan maksimum skrip.
Anda juga boleh membuat perubahan yang sesuai mengikut keperluan anda. Biasanya tidak perlu mengubahnya, nilai lalai sistem sudah mencukupi. Apabila memuat naik fail yang sangat besar, parameter ini mungkin diubah suai.
Muat naik mengambil masa terlalu lama dan akan tamat masa. Jika anda menetapkan parameter ini kepada 0, tempoh tamat masa tidak terhad dan tidak disyorkan.
Selepas melengkapkan konfigurasi php.ini yang berkaitan, kami boleh mula mencuba untuk melengkapkan muat naik fail pertama.
3 Langkah-langkah memuat naik fail
Untuk mempelajari PHP dengan lebih baik, kami akan meringkaskan muat naik fail PHP yang sangat kompleks. Diringkaskan kepada 6 langkah.
Dalam penggunaan sebenar, anda boleh melengkapkan muat naik fail PHP dengan jayanya dengan mengikuti 6 langkah berikut:
1 Tentukan sama ada terdapat kod ralat
Penjelasan terperinci tentang kod ralat yang dikembalikan oleh sistem:
Nota: Tiada ralat kod 5
2. Sesuaikan sama ada saiz fail melebihi julat
Apabila membangunkan fungsi muat naik. Sebagai pembangun, kami, sebagai tambahan kepada nilai muat naik maksimum yang dinyatakan dalam php.ini.
Kami biasanya juga menetapkan nilai, iaitu had saiz muat naik yang ditentukan oleh perniagaan.
Contohnya:
Sina Weibo atau Zon QQ hanya membenarkan satu gambar avatar 2M. Apabila memuat naik album, anda boleh memuat naik lebih daripada 2J.
Jadi, sistemnya menyokong muat naik fail yang lebih besar.
Saiz fail penghakiman di sini digunakan untuk mengehadkan saiz fail yang dimuat naik yang ingin kami tentukan dalam perniagaan sebenar.
3. Tentukan sama ada nama akhiran dan jenis mim sepadan
Terdapat juga orang jahat dalam dunia dalam talian. Mereka akan memasukkan virus ke dalam gambar, memuat naik virus dalam lampiran, dan mereka akan memasukkan virus atau gambar lucah ke dalam halaman web.
Kita perlu menilai jenis akhiran dan mime bagi fail yang dimuat naik.
MIME (Sambungan Mel Internet Serbaguna) ialah jenis sambungan mel Internet pelbagai guna. Ia adalah sejenis kaedah yang menetapkan fail dengan sambungan tertentu untuk dibuka oleh aplikasi Apabila fail dengan sambungan itu diakses, penyemak imbas secara automatik akan menggunakan aplikasi yang ditentukan untuk membukanya. Ia kebanyakannya digunakan untuk menentukan beberapa nama fail yang ditentukan pelanggan dan beberapa kaedah pembukaan fail media.
Apabila menentukan akhiran dan jenis MIME, kami akan menggunakan fungsi PHP in_array(), yang lulus dalam dua parameter.
Parameter pertama ialah nilai yang akan dinilai
Parameter kedua ialah tatasusunan julat.
Kami menggunakan fungsi ini untuk menentukan sama ada sambungan fail dan jenis mime berada dalam julat yang dibenarkan.
4. Jana nama fail
Fail kami telah berjaya dimuat naik, tetapi ia tidak akan menyimpan nama asal.
Kerana sesetengah orang yang mempunyai kata kunci sensitif dalam nama asal mereka akan melanggar undang-undang dan peraturan yang berkaitan di negara kita.
Kami boleh menggunakan date(), mt_rand() atau unique() untuk menjana nama fail rawak.
5 Tentukan sama ada fail dimuat naik
Apabila fail berjaya dimuat naik, sistem akan memuat naik fail sementara yang dimuat naik ke sistem. direktori sementara. Buat fail sementara.
Nama fail sementara juga akan dijana. Apa yang perlu kita lakukan ialah mengalihkan fail sementara ke direktori yang ditentukan pada sistem.
Adalah tidak saintifik untuk tidak bergerak secara membuta tuli sebelum bergerak, atau bergerak secara salah. Sebelum berpindah, kita perlu menggunakan fungsi yang berkaitan untuk menentukan sama ada fail yang dimuat naik adalah fail sementara.
is_uploaded_file() lulus dalam parameter (nama fail cache dalam $_FILES) untuk menentukan sama ada nama yang diluluskan ialah fail yang dimuat naik
6 lokasi
Fail sementara ialah fail sementara sebenar, kami perlu mengalihkannya ke direktori tapak web kami.
Jadikan data dalam direktori tapak web kami boleh diakses oleh orang lain.
Kami menggunakan: move_uploaded_file().
Fungsi ini mengalihkan fail yang dimuat naik ke lokasi yang ditentukan dan menamakannya.
Lepaskan dalam dua parameter:
Parameter pertama ialah fail yang dimuat naik yang menentukan pergerakan
Parameter kedua ialah rentetan yang menggabungkan folder dan nama yang ditentukan
4. Nota pada borang muat naik fail
Kami memulakan pembelajaran formal dan belajar cara memuat naik fail. Untuk memuat naik fail, borang mesti disediakan di halaman web.
Ini adalah borang halaman HTML yang ringkas Borang borang menyediakan kelas khusus untuk kandungan fail Apabila type=file dimasukkan, kandungan fail dimuat naik secara lalai.
Mari kita lihat kod dan nota borang
<html> <head> <meta charset="utf-8" /> <title>单文件上传</title> </head> <body> <form action="file.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> </body> </html>
Nota:
Kaedah parameter dalam borang borang mestilah pos. Jika dapat, muat naik fail tidak boleh dilakukan
enctype mestilah berbilang bahagian/data-bentuk
5. Lengkapkan muat naik fail mengikut tatasusunan dan langkah
1 Fungsi sistem $_FILES
Kandungan fail yang dihantar oleh borang. borang menunjuk ke fail.php .
Kami memproses fail yang dimuat naik melalui kod PHP dalam file.php.
Kami memilih gambar bernama untuk dimuat naik. Andaikan nama gambar ialah: hua.jpg, klik untuk memuat naik.
PHP telah menyediakan fungsi sistem khas $_FILES untuk data fail Semua data berkaitan fail yang dimuat naik disimpan dalam fungsi sistem ini.
Dalam fail PHP, kami mencetak $_FILES untuk memerhati struktur tatasusunan ini:
<?php //var_dump()或print_r() //打印变量的相关信息,将变量的信息详细的展示出来 var_dump($_FILES); ?>
Struktur tatasusunan hasil cetakan adalah seperti berikut:
Struktur tatasusunan di atas diperolehi.
Kita boleh memulakan proses pemprosesan fail.
2. Tentukan kod ralat
<?php if($_FILES['file']['error'] > 0){ switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误 case '1': echo '文件过大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上传'; break; case '4': echo '文件没有被上传'; break; case '6': echo '找不到指定文件夹'; break; case '7': echo '文件写入失败'; break; default: echo "上传出错<br/>"; } }else{ //错误码为0,即上传成功,可以进行后续处理,处理流程见下文 } ?>
Kod di atas memperkenalkan kod ralat dan ralat yang sepadan secara terperinci .
3 Tentukan sama ada fail melebihi saiz
Dalam projek sebenar, disebabkan had perkakasan sistem dan had peranti storan, adalah mustahil untuk membenarkan pengguna memuat naik tanpa sekatan fail, jadi kami perlu mengehadkan saiz fail yang dimuat naik oleh pengguna. Menentukan saiz had yang sesuai boleh menjadikan aplikasi kami berjalan dengan lebih stabil.
//判断错误 if($_FILES['file']['error'] > 0){ //有错误可停止执行 }else{ //当前上传文件无误,运行本段代码 //判断文件是否超出了指定的大小 //单位为byte $MAX_FILE_SIZE = 100000; if($_FILES['file']['size'] > $MAX_FILE_SIZE){ //判断,如果上传的文件,大小超出了我们给的限制范围,退上传并产生错误提示 exit("文件超出指定大小"); }
Mentakrifkan saiz fail yang kami tentukan sebagai $MAX_FILE_SIZE Unit pengiraan pembolehubah ini ialah bait, yang sepadan dengan saiz $_FILES['file']['size'] bagi fail yang dimuat naik.
Dalam kod sampel, had adalah fail dengan saiz lebih kurang 100K dan ke bawah.
4 Tentukan sama ada jenis mime fail adalah betul
Selalunya, fungsi muat naik fail kami perlu menentukan sama ada fail yang dimuat naik oleh pengguna memenuhi keperluan. . Selepas memuat naik fail yang tidak tersedia, ia akan memberi kesan negatif pada kesan paparan keseluruhan aplikasi dalam talian. Jadi kita perlu menggunakan jenis mime dan nama akhiran untuk menentukan sama ada fail yang dimuat naik oleh pengguna memenuhi keperluan.
Dalam kod contoh di bawah, kami menganggap bahawa keperluan projek semasa adalah untuk menentukan imej yang dimuat naik, memerlukan muat naik fail dengan akhiran GIF atau jpg Apabila pengguna memuat naik fail yang tidak memenuhi keperluan, mesej ralat dikembalikan.
/*判断后缀名和MIME类型是否符合指定需求 例如: 当前项目指定上传后缀为.jpg或.gif的图片,则$allowSuffix = array('jpg','gif'); */ //定义允许的后缀名数组 $myImg = explode('.', $_FILES['file']['name']); /* explode() 将一个字符串用指定的字符切割,并返回一个数组,这里我们将文件名用'.''切割,结果存在$myImg中,文件的后缀名即为数组的最后一个值 */ $myImgSuffix = array_pop($myImg); /* 根据上传文件名获取文件的后缀名 使用in_array()函数,判断上传文件是否符合要求 当文件后缀名不在我们允许的范围内时退出上传并返回错误信息 */ if(!in_array($myImgSuffix, $allowSuffix)){ exit("文件后缀名不符"); } /* mime类型和文件后缀名的对应关系,我们可以通过很多途径查询到,为了避免用户自主修改文件后缀名造成文件无法使用。 mime类型也必须做出限制检查mime类型,是为了防止上传者直接修改文件后缀名 导致文件不可用或上传的文件不符合要求。 */ //数组内容为允许上传的mime类型 $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif" ); if(!in_array($_FILES['file']['type'], $allowMime)){ //判断上传文件的mime类型是否在允许的范围内 exit('文件格式不正确,请检查'); //如果不在允许范围内,退出上传并返回错误信息 }
5 Hasilkan laluan dan nama fail yang ditentukan
Jana laluan penyimpanan fail mengikut susunan fail projek Untuk mengelakkan ralat yang disebabkan oleh nama fail pendua, nama fail rawak dijana mengikut format tertentu.
//指定上传文件夹 $path = "upload/images/"; /* 根据当前时间生成随机文件名,本行代码是使用当前时间 + 随机一个0-9的数字组合成文件名,后缀即为前面取到的文件后缀名 */ $name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix;
6 Tentukan sama ada fail itu dimuat naik
Fungsi is_uploaded_file() ialah fungsi khusus untuk menentukan sama ada fail sasaran ialah fail yang dimuat naik.
<?php //使用is_uploaded_file()判断是否是上传文件,函数介绍见上文 if(is_uploaded_file($_FILEs['file']['tmp_name'])){ } ?>
7 Alihkan fail ke lokasi yang ditentukan
Gunakan fungsi move_uploaded_file() untuk mengalihkan fail ke lokasi yang ditentukan dan namakannya. Perlu diingatkan bahawa sistem Linux mempunyai kebenaran pada direktori sasaran dan sama ada ruang cakera mencukupi, jika tidak, operasi muat naik akan gagal.
/* 使用move_uploaded_file()移动上传文件至指定位置,第一个参数为上传文件,第二个参数为我们在前面指定的上传路径和名称。 */ if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){ //提示文件上传成功 echo "上传成功"; }else{ /* 文件移动失败,检查磁盘是否有足够的空间,或者linux类系统中文件夹是否有足够的操作权限 */ echo '上传失败'; } }else{ echo '不是上传文件'; } } ?>
Kod lengkap adalah seperti berikut:
<?php if ($_FILES['file']['error'] > 0) { switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误 case '1': echo '文件过大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上传'; break; case '4': echo '文件没有被上传'; break; case '6': echo '找不到指定文件夹'; break; case '7': echo '文件写入失败'; break; default: echo "上传出错<br/>"; } } else { $MAX_FILE_SIZE = 100000; if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { exit("文件超出指定大小"); } $allowSuffix = array( 'jpg', 'gif', ); $myImg = explode('.', $_FILES['file']['name']); $myImgSuffix = array_pop($myImg); if (!in_array($myImgSuffix, $allowSuffix)) { exit("文件后缀名不符"); } $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif", ); if (!in_array($_FILES['file']['type'], $allowMime)) { exit('文件格式不正确,请检查'); } $path = "upload/images/"; $name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix; if (is_uploaded_file($_FILEs['file']['tmp_name'])) { if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) { echo "上传成功"; } else { echo '上传失败'; } } else { echo '不是上传文件'; } } ?>
6. Muat naik berbilang fail
Memperkenalkan proses memuat naik satu fail dalam PHP. Tetapi kadangkala, untuk kemudahan, kita perlu memenuhi keperluan untuk memuat naik berbilang fail pada masa yang sama. Prinsip muat naik berbilang fail adalah sama, tetapi apabila memproses data, data yang dimuat naik perlu diproses khas.
<html> <head> <meta charset="utf-8" /> <title>单文件上传</title> </head> <body> <form action="morefile.php" method="post" enctype="multipart/form-data"> <input type="file" name="file[]"> <input type="file" name="file[]"> <input type="submit" value="上传"> </form> </body> </html>
Berikut ialah halaman muat naik yang mudah, dan borang menyerahkan dua fail pada masa yang sama. Kami boleh menghantar kandungan melalui halaman ini.
Nota:
input type="file" name="file[]" ditambah selepas fail berbanding sebelum A kurungan segi empat sama
menulis 2 atau lebih jenis input="file" name="file[]"
Kami menggunakan $_FILES untuk menerima maklumat Fail, mencetak dan lihat tatasusunan:
<?php var_dump($_FILES); //打印$_FILES查看数组结构 ?>
Struktur tatasusunan ditunjukkan di sebelah kanan
Kita dapat melihat bahawa dua fail disimpan dalam tatasusunan , nama kunci adalah sama dengan fail tunggal yang dimuat naik. Oleh itu, kita perlu menggunakan gelung for() untuk mendapatkan semula data yang diperlukan daripada kedua-dua fail masing-masing.
Data dua fail disimpan dalam $_FILES pada masa yang sama Kita perlu menggunakan gelung mudah untuk membaca maklumat satu fail dan memindahkan fail ke lokasi yang kita mahu.
for ($i=0; $i < count($_FILE['file']['name']); $i++) { /* 用is_uploaded_file()函数判断是上传文件 并且没有出现错 */ if(is_uploaded_file($_FILEs['file']['tmp_name'][$i]) && $_FILEs['file']['error'][$i] == 0){ if(move_uploaded_file($_FILEs['file']['tmp_name'][$i],'upload/'.$_FILE['file']['name'][$i])){ //用move_uploaded_file()函数移动文件到指定的位置并使用文件原名 echo "上传成功"; }else{ echo '上传失败'; } }else{ echo '上传失败'; } }
Untuk proses penghakiman terperinci, sila rujuk muat naik fail tunggal Hanya pertimbangan asas dibuat di sini, dan tiada peringatan tentang saiz dan format fail.
Sila nilaikan sendiri saiz dan format fail mengikut perniagaan dan berikan peringatan ralat.
7. Pemprosesan kemajuan muat naik fail
Apabila fail terlalu besar atau status rangkaian pengguna adalah sederhana, proses muat naik biasanya mengambil sedikit masa, jika pengguna dibiarkan menunggu dengan skrin kosong pada masa ini, saya percaya kebanyakan pengguna hanya akan menutup aplikasi, jadi keperluan untuk memantau kemajuan muat naik dan melaporkan kepada pengguna dalam masa nyata diletakkan pada desktop oleh produk Wang. Gesaan kemajuan muat naik yang berkualiti tinggi akan membuatkan apl anda dipandang tinggi dengan serta-merta.
Sebelum PHP 5.4, anda sentiasa perlu memasang sambungan tambahan untuk memantau kemajuan muat naik fail. Bermula dari 5.4, ciri baharu session.upload_progress diperkenalkan Kami hanya perlu mendayakan konfigurasi dalam php.ini untuk memantau kemajuan muat naik fail melalui sesi. dalam php.ini.
Nota: Untuk mempelajari bab ini, anda perlu mempunyai pengetahuan asas tentang session dan javascript serta ajax.
Kami perlu mengkonfigurasi, memberi perhatian untuk menyemak dan mengubah suai fail php.ini:
Dengan konfigurasi didayakan, kami boleh merekodkan kemajuan muat naik fail yang lengkap melalui sesi . Dalam sesi, tatasusunan dengan keputusan berikut akan muncul:
$_SESSION["upload_progress_test"] = array( //请求时间 "start_time" => 1234567890, // 上传文件总大小 "content_length" => 57343257, //已经处理的大小 "bytes_processed" => 453489, //当所有上传处理完成后为TRUE,未完成为false "done" => false, "files" => array( 0 => array( //表单中上传框的名字 "field_name" => "file1", //上传文件的名称 "name" => "test1.avi", //缓存文件,上传的文件即保存在这里 "tmp_name" => "/tmp/phpxxxxxx", //文件上传的错误信息 "error" => 0, //是否上传完成,当这个文件处理完成后会变成TRUE "done" => true, //这个文件开始处理时间 "start_time" => 1234567890, //这个文件已经处理的大小 "bytes_processed" => 57343250, ), 1 => array( "field_name" => "file2", "name" => "test2.avi", "tmp_name" => NULL, "error" => 0, "done" => false, "start_time" => 1234567899, "bytes_processed" => 54554, ), ) );
Tatasusunan ini merekodkan kemajuan muat naik fail secara terperinci dan status fail yang telah diproses adalah benar. Seterusnya, kami menggunakan contoh AJAX jQuery untuk mempelajari proses kemajuan muat naik fail.
Pertama, dalam borang, anda perlu menambah teg input dengan type=hidden, dan nilai teg adalah tersuai (adalah disyorkan untuk menggunakan nilai yang bermakna, kerana nilai ini akan digunakan di latar belakang)
<form id="upload-form" action="upload.php" method="POST" enctype="multipart/form-data" style="margin:15px 0" target="hidden_iframe"> <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="test" /> <p><input type="file" name="file1" /></p> <p><input type="submit" value="Upload" /></p> </form> <div id="progress" style="margin-bottom:15px;display:none;"> <div>0%</div> </div>
Di sini, div dengan ID kemajuan ditambahkan sebagai bekas untuk memaparkan kemajuan muat naik. Kami menggunakan setTimeout() js untuk melaksanakan ajax dengan kerap untuk mendapatkan kemajuan muat naik fail, dan fail latar belakang mengembalikan peratusan kemajuan muat naik fail.
<script src="../jquery/1.8.2/jquery.min.js"></script> <script type="text/javascript"> function fetch_progress(){ $.get('progress.php',{ '<?php echo ini_get("session.upload_progress.name"); ?>' : 'test'}, function(data){ var progress = parseInt(data); $('#progress .label').html(progress + '%'); if(progress < 100){ setTimeout('fetch_progress()', 100); //当上传进度小于100%时,显示上传百分比 }else{ $('#progress .label').html('完成!'); //当上传进度等于100%时,显示上传完成 } }, 'html'); } $('#upload-form').submit(function(){ $('#progress').show(); setTimeout('fetch_progress()', 100);//每0.1秒执行一次fetch_progress(),查询文件上传进度 }); </script>
Kod di atas mengembalikan kemajuan muat naik fail setiap 0.1 saat melalui ajax JQ. Dan paparkan peratusan kemajuan dalam teg div.
Kod latar belakang perlu dibahagikan kepada dua bahagian upload.php mengendalikan muat naik fail. progress.php mendapat kemajuan muat naik dalam sesi dan mengembalikan peratusan kemajuan.
Saya tidak akan menerangkan butiran tentang muat naik fail di sini. Sila rujuk perkara di atas untuk mendapatkan langkah terperinci.php:
<?php if(is_uploaded_file($_FILES['file1']['tmp_name'])){ //判断是否是上传文件 //unlink($_FILES['file1']['tmp_name']); move_uploaded_file($_FILES['file1']['tmp_name'], "./{$_FILES['file1']['name']}"); //将缓存文件移动到指定位置 } ?> 主要关注progress.php: <?php /* 开启session。请注意在session_start()之前,请不要有想浏览器输出内容的动作,否则可能引起错误。 */ session_start(); //ini_get()获取php.ini中环境变量的值 $i = ini_get('session.upload_progress.name'); //ajax中我们使用的是get方法,变量名称为ini文件中定义的前缀 拼接 传过来的参数 $key = ini_get("session.upload_progress.prefix") . $_GET[$i]; //判断 SESSION 中是否有上传文件的信息 if (!empty($_SESSION[$key])) { //已上传大小 $current = $_SESSION[$key]["bytes_processed"]; //文件总大小 $total = $_SESSION[$key]["content_length"]; //向 ajax 返回当前的上传进度百分比。 echo $current < $total ? ceil($current / $total * 100) : 100; }else{ echo 100; } ?>
Pada ketika ini, kod kemajuan fail telah selesai. Dengan bahagian hadapan, kita boleh melakukan fungsi muat naik fail yang hebat!
Pengalaman pembelajaran: Ingat enam langkah muat naik fail