Kandungan fail yang diserahkan oleh borang menghala ke file.php.
Kami memproses fail yang dimuat naik melalui kod PHP dalam file.php.
Kami memilih gambar bernama untuk dimuat naik. Andaikan nama gambar ialah: psu.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 melihat struktur tatasusunan ini:
<?php //var_dump()或print_r() //打印变量的相关信息,将变量的信息详细的展示出来 var_dump($_FILES); ?>
Struktur tatasusunan hasil cetakan adalah seperti berikut:
array (size=1) 'file' => array (size=5) //文件名 'name' => string 'psu.jpg' (length=7) //文件的mime类型 'type' => string 'image/jpeg' (length=10) //缓存文件,上传的图片即保存在这里 'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23) //错误码,详见上面错误码介绍 'error' => int 0 //上传的文件大小 'size' => int 225824
Dapatkan di atas struktur Array.
Kita boleh memulakan proses pemprosesan fail.
Langkah pertama ialah menentukan 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 Kod ralat untuk menjana gesaan ralat yang tepat.
Langkah kedua ialah menentukan sama ada fail melebihi saiz. Dalam projek sebenar, disebabkan had perkakasan sistem dan had peranti storan, adalah mustahil untuk pengguna memuat naik fail tanpa had, jadi kami perlu mengehadkan saiz fail yang dimuat naik oleh pengguna. Menentukan saiz had yang sesuai boleh menjadikan aplikasi kami berjalan dengan lebih stabil.
<?php //判断错误 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.
Langkah ketiga ialah menentukan sama ada jenis mime fail adalah betul.
Lazimnya, fungsi muat naik fail kami perlu menentukan sama ada fail yang dimuat naik oleh pengguna memenuhi keperluan Selepas memuat naik fail yang tidak tersedia, kesan paparan keseluruhan aplikasi dalam talian akan terjejas. akan menyebabkan kesan buruk. Jadi kita perlu menggunakan jenis mime dan nama akhiran untuk menentukan sama ada fail yang dimuat naik oleh pengguna memenuhi keperluan.
Dalam kod contoh berikut, 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.
<?php /*判断后缀名和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('文件格式不正确,请检查'); //如果不在允许范围内,退出上传并返回错误信息 } ?>
Langkah keempat ialah menjana 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.
<?php //指定上传文件夹 $path = "upload/images/"; /* 根据当前时间生成随机文件名,本行代码是使用当前时间 + 随机一个0-9的数字组合成文件名,后缀即为前面取到的文件后缀名 */ $name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix; ?>
Langkah kelima ialah menentukan 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'])){ } ?>
Langkah 6, alihkan fail ke lokasi yang ditentukan.
Gunakan fungsi move_uploaded_file() untuk mengalihkan fail ke lokasi yang ditentukan dan menamakannya. Perlu diingatkan bahawa sistem Linux mempunyai kebenaran pada direktori sasaran dan sama ada ruang cakera mencukupi, jika tidak, operasi muat naik akan gagal.
<?php /* 使用move_uploaded_file()移动上传文件至指定位置,第一个参数为上传文件,第二个参数为我们在前面指定的上传路径和名称。 */ if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){ //提示文件上传成功 echo "上传成功"; }else{ /* 文件移动失败,检查磁盘是否有足够的空间,或者linux类系统中文件夹是否有足够的操作权限 */ echo '上传失败'; } }else{ echo '不是上传文件'; } } ?>
Kami menyusun serpihan fail ini menjadi keseluruhan fail:
<?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 '不是上传文件'; } } ?>