企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
[TOC] ## **文件的上传下载** [上传问题,如何在用户没有保存时删除已上传文件-CSDN社区](https://bbs.csdn.net/topics/390974639?list=380694) **对于上传文件的判断需要考虑到的问题** >[danger]1. 构建临时文件 >2. 判断是否是HTTP POST上传的 >3. 判断是否有错误 >4. 判断文件大小 >5. 获取文件扩展名 开启php_fileinfo.dll扩展 获取mime类型 >6. 判断文件类型 >7. 构建目标文件 **注意:对于表单上传文件必须的属性** >[danger]1. method 属性 :必须是 method='post' >2. enctype 属性 :对上传文件进行编码处理 :enctype ='multipart/form-data' **容易出错的地方** **MAX_FILE_SIZE**:` <input type="hidden" name="MAX_FILE_SIZE" value="2048" />`不能大于 ini 设置中upload_max_filesize选项设置的值。 >[danger]**MAX_FILE_SIZE**可以避免等一个大文件传上服务器以后才发现超过限制了,在上传之初就提示用户 **IE**和**FireFox**这两个主流浏览器都不支持这个特性 **upload_max_filesize**:上传单个文件的最大限制(默认2M) **post_max_size**:POST的数据最大字节长度(默认8M);如果post_max_size设置的值太小,则较大的文件会无法被上传。因此,请保证*post_max_size*的值足够的大。 **memory_limit**:最大的内存消耗(默认128M) >[danger]如果内存限制设置被激活,可能需要将[memory_limit](http://php.net/manual/zh/ini.core.php#ini.memory-limit)设置的更大些(默认128M),upload_max_filesize与post_max_size不要超过memory_limit的值 **max_file_uploads**:上传文件数量(默认20) 如果[max_execution_time](http://php.net/manual/zh/info.configuration.php#ini.max-execution-time)(脚本执行的最大时间,默认30s)设置的值太小,脚本运行的时间可能会超过该设置。因此,也请保证*max_execution_time*足够的大。 >[danger] **注意**: [max\_execution\_time](http://php.net/manual/zh/info.configuration.php#ini.max-execution-time)仅仅只影响脚本本身运行的时间。任何其它花费在脚本运行之外的时间,诸如用函数[system()](http://php.net/manual/zh/function.system.php)对系统的调用、[sleep()](http://php.net/manual/zh/function.sleep.php)函数的使用、数据库查询、文件上传等,在计算脚本运行的最大时间时都不包括在内。 >[danger] **注意** [max_input_time](http://php.net/manual/zh/info.configuration.php#ini.max-input-time)以秒为单位设定了脚本接收输入(类似get、post)的最大时间,包括文件上传。对于较大或多个文件,或者用户的网速较慢时,可能会超过默认的*60 秒*。 >[danger]**注意**: session.gc_maxlifetime session的有效期太短时,大文件上传时间超过它页会上传失败 文件上传的相关配置 ``` file_uploads(允许/禁止 PHP开启HTTP文件上传(布尔)) upload_tmp_dir (文件上传临时文件所在目录(字符串)) upload_max_filesize (上传文件最大是多少(整型),单位(bytes)) max_file_uploads (允许上传最大文件数(整型)) max_execution_time (脚本在解析器终止之前运行最长时间(单位:秒)) max_input_time (脚本解析输入数据最长时间(秒)) post_max_size (允许POST数据最大值(字符串/整型)) memory_limt (允许脚本分配的最大内存量(以字节为单位)) upload_max_filesize < post_max_size <memory_limt < 系统物理内存 ``` 不对正在操作的文件进行验证可能意味着用户能够访问其它目录下的敏感信息。 确保php.ini的配置file_uploads是开启的`file_uploads = On` ~~~ <html> <body> <form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <input type="hidden" name="MAX_FILE_SIZE" value="2000" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html> ~~~ upload\_file.php: ~~~ var_dump($_FILES);//array(1) { ["fieldname"]=> array(5) { ["name"]=> string(5) "1.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(24) "D:\xampp\tmp\phpACE5.tmp" ["error"]=> int(0) ["size"]=> int(13789) } }  if(is_uploaded_file($tmp_name = $_FILES['fieldname']['tmp_name'])){  $newdirpath = dirname(__FILE__); $name=$_FILES['fieldname']['name']; $name = time().'xxxxx'.$name; move_uploaded_file($tmp_name, "$newdirpath/$name");  } ~~~ 保存临时文件:move_uploaded_file 当上传文件时php会将会生成一个临时文件,但执行完毕时会将这个临时文件删除,所以我们需要move_uploaded_file永久保存上传的文件 is_uploaded_file() 函数判断指定的文件是否是通过 HTTP POST 上传的 windows10的temp文件可能有权限问题,若有,需要修改上传临时文件地址 修改上传的临时文件地址 修改php.ini中的upload\_tmp\_dir的文件目录 ### **单文件上传** ``` <?php //var_dump($_FILES); $rootpath = 'http://localhost/atest/php/head'; //构建临时文件并quiet判断是否是http post上传 if(is_uploaded_file($tmp_name = $_FILES['fieldname']['tmp_name'])){ //判断错误 if($_FILES['fieldname']['error'] !=0){ switch ($_FILES['fieldname']['error']) { case 1: echo '上传到文件超过了php.ini中设置的upload_max_filesize的值'; break; case 2: echo '上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项限定的值'; break; case 3: echo '文件只有部分被上传'; break; case 4: echo '没有文件被上传'; break; case 6: echo '找不到临时文件'; break; case 7: echo '文件写入失败'; break; default: echo '未知错误!'; break; } } //判断文件大小get_cfg_var或者ini_get都可以获取到ini的配置 $upload_max_filesize=get_cfg_var('upload_max_filesize');//上传允许的单文件的最大值 $post_max_size=ini_get('post_max_size');//上传所有文件字节允许的最大值 $max_file_uploads=ini_get('max_file_uploads');//上传文件的允许最大数量 if($_FILES['fieldname']['size'] > return_bytes($upload_max_filesize)){ echo '文件的大小超过了上传允许的单文件的最大值'; } //设置允许上传的文件类型 $arr_ext = ['image/jpeg','image/png','application/zip']; //利用php_fileinfo.dll对MIME类型进行严格检查在php.ini开启 $fs = finfo_open(FILEINFO_MIME_TYPE);// 创建一个返回 mime 类型的资源 $mime = finfo_file($fs,$_FILES['fieldname']['tmp_name']);//返回上传临时文件的mime类型 // 判断是否包括当前文件类型 if (!in_array($mime,$arr_ext)) { die('上传的文件类型错误'); } //获取文件扩展名:至少有7种以上的方法自行百度 $ext = strchr($_FILES['fieldname']['name'],'.'); $customdir=strtotime(date('Y-m-d',time())); $newdirpath = dirname(__FILE__).'/uploads/'.$customdir; //判断文件夹是否存在不存在新建他 if(!is_dir($newdirpath)){ $re = mkdir($newdirpath,0777,true); if(!$re){ die('目录新建不成功'); } } //$name=$_FILES['fieldname']['name'];原文件名 $newname =uniqid().$ext; $uploadfile=$newdirpath.'/'.$newname; //移动临时文件并保存为永久文件 $result = move_uploaded_file($tmp_name, $uploadfile); if(!$result){ die('上传移动临时文件失败!!'); }else{ echo '上传成功'; var_dump($uploadfile); echo '<div><img src=./uploads/'.$customdir.'/'.$newname.'></div>'; } }else{ header('location:http://localhost/atest/php/head/'); die('请上传文件!'); } /** * [return_bytes 返回给定的字节Bytes 可简写为B] * 注意这里的swith没有break;他会重命中的时候一直执行下去 * @param [string] $val [给定的k(千字节), M,G,...] * @return [int] [返回字节整数] */ function return_bytes($val) { //取出空格 $val = trim($val); //获取字符串最后一个索引并且strtolower转小写 $last = strtolower($val[strlen($val)-1]); switch($last) { case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; } ``` ## **多文件上传** ``` <?php $rootpath = 'http://localhost/atest/php/head'; if($_FILES['fieldname']){ $fieldname=$_FILES['fieldname']; if(count($fieldname['tmp_name']) > 1){ $upload_max_filesize=get_cfg_var('upload_max_filesize');// 100M 上传允许的单文件的最大值 $post_max_size=ini_get('post_max_size');//100M 上传所有文件字节允许的最大值 $max_file_uploads=ini_get('max_file_uploads');//20 上传文件的允许最大数量 //设置允许上传的文件类型 $arr_ext = ['image/jpeg','image/png','application/zip']; //利用php_fileinfo.dll对MIME类型进行严格检查在php.ini开启 $fs = finfo_open(FILEINFO_MIME_TYPE);// 创建一个返回 mime 类型的资源 $customdir=strtotime(date('Y-m-d',time())); $newdirpath = dirname(__FILE__).'/uploads/'.$customdir; //判断文件夹是否存在不存在新建他 if(!is_dir($newdirpath)){ $re = mkdir($newdirpath,0777,true); if(!$re){ die('目录新建不成功'); } } //随便循环一个将 三维数组变为2维 以得到key $totalsize=''; foreach ($fieldname['tmp_name'] as $key => $tmpfile) { //判断是否是HTTP POST上传的 if(is_uploaded_file($fieldname['tmp_name'][$key])){ //判断错误 if($_FILES['fieldname']['error'][$key] !=0){ switch ($_FILES['fieldname']['error']) { case 1: echo $fieldname['name'][$key].'上传到文件超过了php.ini中设置的upload_max_filesize的值'; break; case 2: echo $fieldname['name'][$key].'上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项限定的值'; break; case 3: echo $fieldname['name'][$key].'文件只有部分被上传'; break; case 4: echo $fieldname['name'][$key].'没有文件被上传'; break; case 6: echo $fieldname['name'][$key].'找不到临时文件'; break; case 7: echo $fieldname['name'][$key].'文件写入失败'; break; default: echo $fieldname['name'][$key].'未知错误!'; break; } } //构建临时文件 $tmp_file=$tmpfile; //判断文件大小get_cfg_var或者ini_get都可以获取到ini的配置 if($fieldname['size'][$key] > return_bytes($upload_max_filesize)){ echo '文件的大小超过了上传允许的单文件的最大值'; } if(count($fieldname['tmp_name']) > return_bytes($max_file_uploads)){ echo '文件数量超过上传文件的允许最大数量'; } $totalsize += $fieldname['size'][$key]; //返回上传临时文件的mime类型 $mime = finfo_file($fs,$tmpfile); // 判断是否包括当前文件类型 if (!in_array($mime,$arr_ext)) { die('上传的'.$fieldname['name'][$key].'文件类型错误'); } //获取文件扩展名:至少有7种以上的方法自行百度 $ext = strchr($fieldname['name'][$key],'.'); //$name=$_FILES['fieldname']['name'];原文件名 $newname =uniqid().$ext; $uploadfile=$newdirpath.'/'.$newname; //移动临时文件并保存为永久文件 $result = move_uploaded_file($tmpfile, $uploadfile); if(!$result){ die('上传移动临时文件失败!!'); }else{ echo '上传成功'; var_dump($uploadfile); echo '<div><img src=./uploads/'.$customdir.'/'.$newname.'></div>'; } }else{ header('location:http://localhost/atest/php/head/'); die('非法文件'); } } if($totalsize > return_bytes($post_max_size)){ echo '所有上传文件的大小超过了允许的最大值'; } }else{ die('多文件上传不应该出现的这个未知错误'); } }else{ header('location:'.$rootpath); } /** * [return_bytes 返回给定的字节] * 注意这里的swith没有break;他会重命中的时候一直执行下去 * @param [string] $val [给定的k(千字节), M,G,...] * @return [int] [返回字节整数] */ function return_bytes($val) { //取出空格 $val = trim($val); //获取字符串最后一个索引并且strtolower转小写 $last = strtolower($val[strlen($val)-1]); switch($last) { case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; } ``` 2 ``` public function uploadimgs(){ if (!isset($_FILES['myfile']['error'])){ return json(['error'=>1,'message'=>"Invalid parameters.", "file"=>""]); } $saveDir="profile"; $file_num=count($_FILES['myfile']['name']); $file_total_size=array_sum($_FILES['myfile']['size']);//对数组中所有值求和 if ($file_num>=1) { $newdirpath=\think\facade\App::getRootPath().'public'.DIRECTORY_SEPARATOR.'uploads'.DIRECTORY_SEPARATOR.$saveDir.DIRECTORY_SEPARATOR; if (!file_exists($newdirpath)) { mkdir($newdirpath,0777,true);//第三个参数允许多级嵌套创建 } $upload_max_filesize=get_cfg_var('upload_max_filesize');// 100M 上传允许的单文件的最大值 $post_max_size=ini_get('post_max_size');//100M 上传所有文件字节允许的最大值 $max_file_uploads=ini_get('max_file_uploads');//20 上传文件的允许最大数量 // 判断所有文件数量 if(config("upload.upload_max_file") <= $max_file_uploads && $file_num > config("upload.upload_max_file")){ return json(['error'=>1,'message'=>"文件的数量超过了允许的最大值", "file"=>""]); } if ($file_num > $max_file_uploads) { return json(['error'=>1,'message'=>"文件数量超过了php允许的最大值", "file"=>""]); } // 将保存的信息 $save_arr=[]; for ($i=0; $i < $file_num; $i++) { $tmp_name = $_FILES['myfile']['tmp_name'][$i]; $original_name = $_FILES['myfile']['name'][$i]; // 否是通过 HTTP POST 上传的 if(is_uploaded_file($tmp_name)){ if($_FILES['myfile']['error'] !=0){ switch ($_FILES['myfile']['error']) { case 1: return json(['error'=>1,'message'=>"上传到文件超过了php.ini中设置的upload_max_filesize的值", "file"=>$_FILES['myfile']['name'][$i]]); break; case 2: return json(['error'=>1,'message'=>"上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项限定的值", "file"=>$_FILES['myfile']['name'][$i]]); break; case 3: return json(['error'=>1,'message'=>"文件只有部分被上传", "file"=>$_FILES['myfile']['name'][$i]]); break; case 4: return json(['error'=>1,'message'=>"没有文件被上传", "file"=>$_FILES['myfile']['name'][$i]]); break; case 6: return json(['error'=>1,'message'=>"找不到临时文件", "file"=>$_FILES['myfile']['name'][$i]]); break; case 7: return json(['error'=>1,'message'=>"文件写入失败", "file"=>$_FILES['myfile']['name'][$i]]); break; default: break; } } // 判断文件大小get_cfg_var或者ini_get都可以获取到ini的配置 if(config("upload.upload_max_filesize") <= stringSizeToBytes($upload_max_filesize) && $_FILES['myfile']['size'][$i] > config("upload.upload_max_filesize")){ return json(['error'=>1,'message'=>"单文件的大小超过了允许的最大值", "file"=>$original_name]); } if ($_FILES['myfile']['size'][$i] > stringSizeToBytes($upload_max_filesize)) { return json(['error'=>1,'message'=>"单文件的大小超过了php允许的最大值", "file"=>$original_name]); } // 判断所有文件大小 if(config("upload.post_max_size") <= stringSizeToBytes($post_max_size) && $_FILES['myfile']['size'][$i] > config("upload.post_max_size")){ return json(['error'=>1,'message'=>"所有文件的大小超过了允许的最大值", "file"=>$original_name]); } if ($_FILES['myfile']['size'][$i] > stringSizeToBytes($post_max_size)) { return json(['error'=>1,'message'=>"所有文件的大小超过了php允许的最大值", "file"=>$original_name]); } // 文件类型 if (extension_loaded("fileinfo")) { //设置允许上传的文件类型 $arr_mime= ['image/jpeg','image/png','image/jpg']; //利用php_fileinfo.dll对MIME类型进行严格检查在php.ini开启 $fs = finfo_open(FILEINFO_MIME_TYPE);// 创建一个返回 mime 类型的资源 $mime = finfo_file($fs,$_FILES['myfile']['tmp_name'][$i]);//返回上传临时文件的mime类型 // 判断是否包括当前文件类型 if (!in_array($mime,$arr_mime)) { return json(['error'=>1,'message'=>"上传的文件类型错误", "file"=>$original_name]); } }else{ //设置允许上传的文件类型 $arr_ext = ['jpeg','png','jpg','jpeg']; if (!in_array(strtolower(pathinfo($_FILES['myfile']['name'][$i], PATHINFO_EXTENSION)), $arr_ext)) { return json(['error'=>1,'message'=>"上传的文件类型错误", "file"=>$original_name]); } } $name=$_FILES['myfile']['name'][$i]; $name =md5($name).md5(time()+mt_rand()).'.'.explode('/',$mime)[1]; $save_arr[$i]["name"]=$name; $save_arr[$i]["tmp_name"]=$tmp_name; $save_arr[$i]["original_name"]=$original_name; }else{ return json(['error'=>1,'message'=>"未检测到上传文件", "file"=>$original_name]); } } $files=[]; foreach ($save_arr as $key => &$files_info) { $uploaded_result =move_uploaded_file($files_info['tmp_name'], "{$newdirpath}{$files_info['name']}"); if ($uploaded_result==false) { return json(['error'=>1,'message'=>"上传的文件移动到新位置失败", "file"=>$original_name]); }else{ // $files[]="{$newdirpath}{$files_info['name']}"; foreach ($files as $filename) { @unlink($filename); } $files[]="/uploads/".$saveDir."/".$files_info['name']; } } return json(['error'=>0,'message'=>"ok", "file"=>$files]); }else{ return json(['error'=>1,'message'=>"没有上传文件", "file"=>""]); } } ``` ## **点击某个元素触发input[type=file]的点击事件** ``` $(function () { $('#msg-image').click(function () { return $('#chat_image').click(); //注意这句,主要是需要return点击事件返回值 }); }) ``` ## **ajax上传** 方法1 ``` <form id="myForm"> <input type="text" name="name" placeholder="Name"> <input type="email" name="email" placeholder="Email"> <button type="submit">Submit</button> </form> $(document).ready(function() { $('#myForm').submit(function(e) { e.preventDefault(); // 阻止表单默认提交行为 var formData = $(this).serialize(); // 获取表单数据 格式如:brand_name=%E9%98%BF%E6%9D%BE%E5%A4%A7&brand_url=&brand_img=&brand_description=&status=1&group_id=8 $.ajax({ type: 'POST', url: 'handle_form.php', // 后端 PHP 文件的路径 data: formData, success: function(response) { // 处理后端返回的响应 console.log(response); } }); }); }); ``` 方法2: ![](https://img.kancloud.cn/ee/ca/eecaa2fdc358741110f12c7cf5b88afe_86x79.png) ``` <style> .ab-l label { display: block; width: 106px; height: 106px; background-color: #e5ecf4; border-radius: 50%; position: relative; } .ab-l .inp { position: absolute; left: -9999px; } .ab-l label .user { position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); -moz-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); width: 100px; height: 100px; display: block; -webkit-border-radius: 50%; -moz-border-radius: 50%; border-radius: 50%; } span{ margin: 0; padding: 0; border: 0; font-size: 100%; vertical-align: baseline; } ab-l label .user img { width: 100%; height: 100%; display: block; -webkit-border-radius: 50%; -moz-border-radius: 50%; border-radius: 50%; } img { max-width: 100%; border: none; } .ab-l label .icon { position: absolute; bottom: 3px; left: 50%; -webkit-transform: translateX(-50%); -moz-transform: translateX(-50%); -ms-transform: translateX(-50%); -o-transform: translateX(-50%); transform: translateX(-50%); width: 60px; height: 19px; display: block; } .ab-l label .icon img { width: 100%; height: 100%; display: block; -webkit-border-radius: 50%; -moz-border-radius: 50%; border-radius: 50%; } img { max-width: 100%; border: none; } </style> <div class="ab-l"> <label> <input class="inp js-upload" type="file"> <span class="user"><img src="/uploads/profile/84d23e52bd20502993528c0b048019041650279026.png " alt=""></span> <span class="icon"><img src="/template/default/index/images/icon55.png" alt=""></span> </label> </div> ``` ``` $('body').on('change', '.js-upload', function() { var filePath = $(this).val(), //获取到input的value,里面是文件的路径 C:\fakepath\QQ截图20210402171830.png fileFormat = filePath.substring(filePath.lastIndexOf(".")).toLowerCase(), src = window.URL.createObjectURL(this.files[0]); //转成可以在本地预览的格式 if (!fileFormat.match(/.png|.jpg|.jpeg/)) { alert('上传错误,文件格式必须为:png/jpg/jpeg'); return; } // 检查是否是图片 //File {name: 'QQ截图20210402171830.png', lastModified: 1690076246000, lastModifiedDate: Sun Jul 23 2022 09:37:26 GMT+0800 (中国标准时间), webkitRelativePath: '', size: 35966,type:"image/png", size:35966} var imgs = $('.js-upload').get(0).files[0];//同上面的this.files[0] var formData = new FormData();//新建一个formData来储存需要传递的信息 formData.append('image', imgs);//需要传递的字段image路径 formData.append('Authorization', "{:session('user.id')}");//id console.log(imgs) console.log(formData) $.ajax({ type: 'POST', url: '/index/User/uploadimg.html', // headers: { // 'yl-authorization': obj.mobile // }, data: formData, contentType:false, processData:false, dataType: 'json', success: function (data) { console.log(data); }, error: function (err) { } }); $(this).siblings('.user').children('img').attr('src', src) }); ``` ``` /** * 图片上传(头像) * @return [type] [description] */ public function uploadimg(){ $data=\think\facade\Request::param(); $uploaded_result=false; $tmp_name = $_FILES['image']['tmp_name']; if(is_uploaded_file($tmp_name)){ $error=0; if($_FILES['image']['error'] !=0){ $error=1; switch ($_FILES['image']['error']) { case 1: $message= '上传到文件超过了php.ini中设置的upload_max_filesize的值'; break; case 2: $message= '上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项限定的值'; break; case 3: $message= '文件只有部分被上传'; break; case 4: $message= '没有文件被上传'; break; case 6: $message= '找不到临时文件'; break; case 7: $message= '文件写入失败'; break; default: $message= '未知错误!'; break; } } // //判断文件大小get_cfg_var或者ini_get都可以获取到ini的配置 // $upload_max_filesize=ini_get('upload_max_filesize');//上传允许的单文件的最大值 if($_FILES['image']['size'] > (1024*1024)){ $error=1; $message ='文件的大小超过了上传允许的单文件的最大值'; } //设置允许上传的文件类型 $arr_ext = ['image/jpeg','image/png','image/jpg']; //利用php_fileinfo.dll对MIME类型进行严格检查在php.ini开启 $fs = finfo_open(FILEINFO_MIME_TYPE);// 创建一个返回 mime 类型的资源 $mime = finfo_file($fs,$_FILES['image']['tmp_name']);//返回上传临时文件的mime类型 // 判断是否包括当前文件类型 if (!in_array($mime,$arr_ext)) { $error=1; $message='上传的文件类型错误'; } if($error==1){ $result['error']=1; $result['message']=$message; return json($result); } $newdirpath=\think\facade\App::getRootPath().'public'.DIRECTORY_SEPARATOR.'uploads'.DIRECTORY_SEPARATOR.'profile'.DIRECTORY_SEPARATOR; if (!file_exists($newdirpath)) { mkdir($newdirpath,0777,true);//第三个参数允许多级嵌套创建 } $name=$_FILES['image']['name']; $name =md5($name).time().'.'.explode('/',$mime)[1]; $uploaded_result =move_uploaded_file($tmp_name, "{$newdirpath}{$name}"); } // /*array ( 'image' => array ( 'name' => 'ban5.jpg', 'type' => 'image/jpeg', 'tmp_name' => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\php70E2.tmp', 'error' => 0, 'size' => 131596, ), )"*/ if ($uploaded_result==true) { $user = \app\common\model\Users::find(session("user.id")); $user->image="/uploads/profile/".$name; $res=$user->save(); $res=true; if ($res==true) { $result['error']=0; $result['message']="/uploads/profile/".$name; }else{ $result['error']=1; $result['message']=""; } }else{ $result['error']=1; $result['message']=$message; } return json($result); } ``` ## **多文件上传与单文件上传时全局变量$_FILES的数组格式** ### **单文件上传** ``` <input type="file" name="myfile"> ``` 返回格式: ``` array ( 'myfile' => array ( 'name' => '22@2x.png', 'type' => 'image/png', 'tmp_name' => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\phpD1BD.tmp', 'error' => 0, 'size'=> 1456491, ), ) ``` >[danger] 注意如果想要和多文件上传的格式保持一致则 设置为name="myfile[index]",如:name="myfile[1]" <input type="file" name="myfile[1]"> ``` array ( 'myfile' => array ( 'name' => array ( 1 => '22.png', ), 'type' => array ( 1 => 'image/png', ), 'tmp_name' => array ( 1 => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\php51C3.tmp', ), 'error' => array ( 1 => 0, ), 'size' => array ( 1 => 504877, ), ), ) ``` ### **多文件上传** 设置multiple属性时,html表单可提交多个文件 ``` <input type="file" name="myfile[]" multiple> ``` >[danger]多个文件时name后面必须加[],否则$_FILES只保存最后一个文件 multiple只影响表单是否上传多个文件,name加[]只影响$_FILES数组的格式 多文件上传时只上传单个文件 ``` array ( 'myfile' => array ( 'name' => array ( 0 => '22.png', ), 'type' => array ( 0 => 'image/png', ), 'tmp_name' => array ( 0 => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\php51C3.tmp', ), 'error' => array ( 0 => 0, ), 'size' => array ( 0 => 504877, ), ), ) ``` 多文件上传时多个文件 ``` array ( 'myfile' => array ( 'name' => array ( 0 => '2022-07-07_100253.PNG', 1 => '2022-07-07_100445.PNG', ), 'type' => array ( 0 => 'image/png', 1 => 'image/png', ), 'tmp_name' => array ( 0 => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\phpE441.tmp', 1 => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\phpE442.tmp', ), 'error' => array ( 0 => 0, 1 => 0, ), 'size' => array ( 0 => 398057, 1 => 496146, ), ), ) ``` ### **同时多个表单** ``` array ( 'myfile' => array ( 'name' => array ( 0 => '2022-07-07_100445.PNG', 1 => '2022-07-07_113211.PNG', 2 => '2022-07-08_105004.PNG', ), 'type' => array ( 0 => 'image/png', 1 => 'image/png', 2 => 'image/png', ), 'tmp_name' => array ( 0 => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\phpA1D2.tmp', 1 => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\phpA1D3.tmp', 2 => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\phpA1D4.tmp', ), 'error' => array ( 0 => 0, 1 => 0, 2 => 0, ), 'size' => array ( 0 => 496146, 1 => 21370, 2 => 684697, ), ), 'myfileOne' => array ( 'name' => '22@2x.png', 'type' => 'image/png', 'tmp_name' => 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\phpA1D5.tmp', 'error' => 0, 'size' => 1456491, ), ) ``` ## **上传表单 详解** >[danger] 注意这些都是在前端可更改的 **文件大小限制,注意可更改的** ``` <input type="hidden" name="MAX_FILE_SIZE" value="496145" title="Permitted bytes per file.499712" /> <input type="file" name="pictures[4]" accept="image/*"/> ``` 限制文件类型 ``` <input type="file" name="pictures1[]" accept="image/*"/> <input type="file" name="pictures2[]" accept="image/png,i mage/jpg"/> ``` ``` <input type="file" id="docpicker" accept=".doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> //application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document是word文档? ``` **唯一文件类型说明符**是一个字符串,表示在`file`类型的[`<input>`](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input)元素中用户可以选择的文件类型。每个唯一文件类型说明符可以采用下列形式之一: * 一个以英文句号(“.”)开头的合法的不区分大小写的文件名扩展名。例如:`.jpg`、`.pdf`或`.doc`。 * 一个不带扩展名的 MIME 类型字符串。 * 字符串`audio/*`,表示“任何音频文件”。 * 字符串`video/*`,表示“任何视频文件”。 * 字符串`image/*`,表示“任何图片文件”。 `accept`属性的值是包含一个或多个(用逗号分隔)唯一文件类型说明符的字符串。例如,一个文件选择器需要能被表示成一张图片的内容,包括标准的图片格式和 PDF 文件,大概是这样的: ``` <input type="file" accept="image/*,.pdf" /> ``` ~~~text /** * [getFileType 下载文档对应的类型] * @param {[type]} type [description] * @param {[type]} id [description] * @return {[type]} [description] */ export function getFileType(id) { let arr = [ { type: "doc", application: "application/msword" }, { type: "docx", application: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, { type: "dot", application: "application/msword" }, { type: "dotx", application: "application/vnd.openxmlformats-officedocument.wordprocessingml.template" }, { type: "xls", application: "application/vnd.ms-excel" }, { type: "xlsx", application: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, { type: "ppt", application: "application/vnd.ms-powerpoint" }, { type: "pptx", application: "application/vnd.openxmlformats-officedocument.presentationml.presentation" }, { type: "pdf", application: "application/pdf" }, { type: "txt", application: "text/plain" }, { type: "gif", application: "image/gif" }, { type: "jpeg", application: "image/jpeg" }, { type: "jpg", application: "image/jpeg" }, { type: "png", application: "image/png" }, { type: "css", application: "text/css" }, { type: "html", application: "text/html" }, { type: "htm", application: "text/html" }, { type: "xsl", application: "text/xml" }, { type: "xml", application: "text/xml" }, { type: "mpeg", application: "video/mpeg" }, { type: "mpg", application: "video/mpeg" }, { type: "avi", application: "video/x-msvideo" }, { type: "movie", application: "video/x-sgi-movie" }, { type: "bin", application: "application/octet-stream" }, { type: "exe", application: "application/octet-stream" }, { type: "so", application: "application/octet-stream" }, { type: "dll", application: "application/octet-stream" }, { type: "ai", application: "application/postscript" }, { type: "dir", application: "application/x-director" }, { type: "js", application: "application/x-javascript" }, { type: "swf", application: "application/x-shockwave-flash" }, { type: "xhtml", application: "application/xhtml+xml" }, { type: "xht", application: "application/xhtml+xml" }, { type: "zip", application: "application/zip" }, { type: "mid", application: "audio/midi" }, { type: "midi", application: "audio/midi" }, { type: "mp3", application: "audio/mpeg" }, { type: "rm", application: "audio/x-pn-realaudio" }, { type: "rpm", application: "audio/x-pn-realaudio-plugin" }, { type: "wav", application: "audio/x-wav" }, { type: "bmp", application: "image/bmp" } ]; return findArrayReturnValue(arr, "type", id, "application"); } ~~~ .rar application/x-rar-compressed **常见的 mine type 文件类型:** | MIME type| File extensions | | --- | --- | | application/vnd.openxmlformats-officedocument.wordprocessingml.document| docx| |application/msword|doc| |application/pdf|pdf| |application/rtf|rtf| |application/vnd.ms-excel|xls| |application/vnd.ms-powerpoint|ppt| |application/x-rar-compressed|rar| |application/x-shockwave-flash|swf| |application/zip|zip| |audio/midi|mid midi kar| |audio/mpeg|mp3| |audio/ogg|ogg| |audio/x-m4a|m4a| |audio/x-realaudio|ra| |image/gif|gif| |image/jpeg|jpeg jpg| |image/png|png| |image/tiff|tif tiff| |image/vnd.wap.wbmp|wbmp| |image/x-icon|ico| |image/x-jng|jng| |image/x-ms-bmp|bmp| |image/svg+xml|svg svgz| |image/webp|webp| |text/css|css| |text/html|html htm shtml| |text/plain|txt| |text/xml|xml| |video/3gpp|3gpp 3gp| |video/mp4|mp4| |video/mpeg|mpeg mpg| |video/quicktime|mov| |video/webm|webm| |video/x-flv|flv| |video/x-m4v|m4v| |video/x-ms-wmv|wmv| |video/x-msvideo|avi|