ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 文件的上传下载 ## **文件的上传下载** **对于上传文件的判断需要考虑到的问题** > 1. 构建临时文件 > 2. 判断是否是HTTP POST上传的 > 3. 判断是否有错误 > 4. 判断文件大小 > 5. 获取文件扩展名 > 开启php\_fileinfo.dll扩展 > 获取mime类型 > 6. 判断文件类型 > 7. 构建目标文件 **注意:对于表单上传文件必须的属性** > 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选项设置的值。 > **MAX\_FILE\_SIZE**可以避免等一个大文件传上服务器以后才发现超过限制了,在上传之初就提示用户 > **IE**和**FireFox**这两个主流浏览器都不支持这个特性 **upload\_max\_filesize**:上传单个文件的最大限制(默认2M) **post\_max\_size**:POST的数据最大字节长度(默认8M);如果post\_max\_size设置的值太小,则较大的文件会无法被上传。因此,请保证*post\_max\_size*的值足够的大。 **memory\_limit**:最大的内存消耗(默认128M) > 如果内存限制设置被激活,可能需要将[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*足够的大。 > **注意**:[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)函数的使用、数据库查询、文件上传等,在计算脚本运行的最大时间时都不包括在内。 **Warning** [max\_input\_time](http://php.net/manual/zh/info.configuration.php#ini.max-input-time)以秒为单位设定了脚本接收输入(类似get、post)的最大时间,包括文件上传。对于较大或多个文件,或者用户的网速较慢时,可能会超过默认的*60 秒*。 不对正在操作的文件进行验证可能意味着用户能够访问其它目录下的敏感信息。 确保php.ini的配置file\_uploads是开启的`file_uploads = On` ``` <pre class="calibre10">``` <span class="token1"><</span>html<span class="token1">></span> <span class="token1"><</span>body<span class="token1">></span> <span class="token1"><</span>form action<span class="token1">=</span><span class="token2">"upload_file.php"</span> method<span class="token1">=</span><span class="token2">"post"</span> enctype<span class="token1">=</span><span class="token2">"multipart/form-data"</span><span class="token1">></span> <span class="token1"><</span>label <span class="token5">for</span><span class="token1">=</span><span class="token2">"file"</span><span class="token1">></span>Filename<span class="token3">:</span><span class="token1"><</span><span class="token1">/</span>label<span class="token1">></span> <span class="token1"><</span>input type<span class="token1">=</span><span class="token2">"file"</span> name<span class="token1">=</span><span class="token2">"file"</span> id<span class="token1">=</span><span class="token2">"file"</span> <span class="token1">/</span><span class="token1">></span> <span class="token1"><</span>input type<span class="token1">=</span><span class="token2">"hidden"</span> name<span class="token1">=</span><span class="token2">"MAX_FILE_SIZE"</span> value<span class="token1">=</span><span class="token2">"2000"</span> <span class="token1">/</span><span class="token1">></span> <span class="token1"><</span>br <span class="token1">/</span><span class="token1">></span> <span class="token1"><</span>input type<span class="token1">=</span><span class="token2">"submit"</span> name<span class="token1">=</span><span class="token2">"submit"</span> value<span class="token1">=</span><span class="token2">"Submit"</span> <span class="token1">/</span><span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>form<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>body<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>html<span class="token1">></span> ``` ``` upload\_file.php: ``` <pre class="calibre10">``` <span class="token4">var_dump</span><span class="token3">(</span>$_FILES<span class="token3">)</span><span class="token3">;</span><span class="token">//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) } }</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">is_uploaded_file</span><span class="token3">(</span>$tmp_name <span class="token1">=</span> $_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'tmp_name'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> $newdirpath <span class="token1">=</span> <span class="token4">dirname</span><span class="token3">(</span>__FILE__<span class="token3">)</span><span class="token3">;</span> $name<span class="token1">=</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">;</span> $name <span class="token1">=</span> <span class="token4">time</span><span class="token3">(</span><span class="token3">)</span><span class="token3">.</span><span class="token2">'xxxxx'</span><span class="token3">.</span>$name<span class="token3">;</span> <span class="token4">move_uploaded_file</span><span class="token3">(</span>$tmp_name<span class="token3">,</span> <span class="token2">"$newdirpath/$name"</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> ``` ``` 保存临时文件:move\_uploaded\_file 当上传文件时php会将会生成一个临时文件,但执行完毕时会将这个临时文件删除,所以我们需要move\_uploaded\_file永久保存上传的文件 is\_uploaded\_file() 函数判断指定的文件是否是通过 HTTP POST 上传的 windows10的temp文件可能有权限问题,若有,需要修改上传临时文件地址 修改上传的临时文件地址 修改php.ini中的upload\_tmp\_dir的文件目录 单文件上传 ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">?</span>php <span class="token">//var_dump($_FILES);</span> $rootpath <span class="token1">=</span> <span class="token2">'http://localhost/atest/php/head'</span><span class="token3">;</span> <span class="token">//构建临时文件并quiet判断是否是http post上传</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">is_uploaded_file</span><span class="token3">(</span>$tmp_name <span class="token1">=</span> $_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'tmp_name'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> <span class="token">//判断错误</span> <span class="token5">if</span><span class="token3">(</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'error'</span><span class="token3">]</span> <span class="token1">!=</span><span class="token6">0</span><span class="token3">)</span><span class="token3">{</span> switch <span class="token3">(</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'error'</span><span class="token3">]</span><span class="token3">)</span> <span class="token3">{</span> case <span class="token6">1</span><span class="token3">:</span> echo <span class="token2">'上传到文件超过了php.ini中设置的upload_max_filesize的值'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">2</span><span class="token3">:</span> echo <span class="token2">'上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项限定的值'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">3</span><span class="token3">:</span> echo <span class="token2">'文件只有部分被上传'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">4</span><span class="token3">:</span> echo <span class="token2">'没有文件被上传'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">6</span><span class="token3">:</span> echo <span class="token2">'找不到临时文件'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">7</span><span class="token3">:</span> echo <span class="token2">'文件写入失败'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> default<span class="token3">:</span> echo <span class="token2">'未知错误!'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//判断文件大小get_cfg_var或者ini_get都可以获取到ini的配置</span> $upload_max_filesize<span class="token1">=</span><span class="token4">get_cfg_var</span><span class="token3">(</span><span class="token2">'upload_max_filesize'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//上传允许的单文件的最大值</span> $post_max_size<span class="token1">=</span><span class="token4">ini_get</span><span class="token3">(</span><span class="token2">'post_max_size'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//上传所有文件字节允许的最大值</span> $max_file_uploads<span class="token1">=</span><span class="token4">ini_get</span><span class="token3">(</span><span class="token2">'max_file_uploads'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//上传文件的允许最大数量</span> <span class="token5">if</span><span class="token3">(</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'size'</span><span class="token3">]</span> <span class="token1">></span> <span class="token4">return_bytes</span><span class="token3">(</span>$upload_max_filesize<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">'文件的大小超过了上传允许的单文件的最大值'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//设置允许上传的文件类型</span> $arr_ext <span class="token1">=</span> <span class="token3">[</span><span class="token2">'image/jpeg'</span><span class="token3">,</span><span class="token2">'image/png'</span><span class="token3">,</span><span class="token2">'application/zip'</span><span class="token3">]</span><span class="token3">;</span> <span class="token">//利用php_fileinfo.dll对MIME类型进行严格检查在php.ini开启</span> $fs <span class="token1">=</span> <span class="token4">finfo_open</span><span class="token3">(</span>FILEINFO_MIME_TYPE<span class="token3">)</span><span class="token3">;</span><span class="token">// 创建一个返回 mime 类型的资源</span> $mime <span class="token1">=</span> <span class="token4">finfo_file</span><span class="token3">(</span>$fs<span class="token3">,</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'tmp_name'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span><span class="token">//返回上传临时文件的mime类型</span> <span class="token">// 判断是否包括当前文件类型</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span><span class="token4">in_array</span><span class="token3">(</span>$mime<span class="token3">,</span>$arr_ext<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'上传的文件类型错误'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//获取文件扩展名:至少有7种以上的方法自行百度</span> $ext <span class="token1">=</span> <span class="token4">strchr</span><span class="token3">(</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">,</span><span class="token2">'.'</span><span class="token3">)</span><span class="token3">;</span> $customdir<span class="token1">=</span><span class="token4">strtotime</span><span class="token3">(</span><span class="token4">date</span><span class="token3">(</span><span class="token2">'Y-m-d'</span><span class="token3">,</span><span class="token4">time</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> $newdirpath <span class="token1">=</span> <span class="token4">dirname</span><span class="token3">(</span>__FILE__<span class="token3">)</span><span class="token3">.</span><span class="token2">'/uploads/'</span><span class="token3">.</span>$customdir<span class="token3">;</span> <span class="token">//判断文件夹是否存在不存在新建他</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span><span class="token4">is_dir</span><span class="token3">(</span>$newdirpath<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> $re <span class="token1">=</span> <span class="token4">mkdir</span><span class="token3">(</span>$newdirpath<span class="token3">,</span><span class="token6">0777</span><span class="token3">,</span><span class="token6">true</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span>$re<span class="token3">)</span><span class="token3">{</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'目录新建不成功'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//$name=$_FILES['fieldname']['name'];原文件名</span> $newname <span class="token1">=</span><span class="token4">uniqid</span><span class="token3">(</span><span class="token3">)</span><span class="token3">.</span>$ext<span class="token3">;</span> $uploadfile<span class="token1">=</span>$newdirpath<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$newname<span class="token3">;</span> <span class="token">//移动临时文件并保存为永久文件</span> $result <span class="token1">=</span> <span class="token4">move_uploaded_file</span><span class="token3">(</span>$tmp_name<span class="token3">,</span> $uploadfile<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span>$result<span class="token3">)</span><span class="token3">{</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'上传移动临时文件失败!!'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> echo <span class="token2">'上传成功'</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$uploadfile<span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'<div><img src=./uploads/'</span><span class="token3">.</span>$customdir<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$newname<span class="token3">.</span><span class="token2">'></div>'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'location:http://localhost/atest/php/head/'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'请上传文件!'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * [return_bytes 返回给定的字节] * 注意这里的swith没有break;他会重命中的时候一直执行下去 * @param [string] $val [给定的k(千字节), M,G,...] * @return [int] [返回字节整数] */</span> <span class="token5">function</span> <span class="token4">return_bytes</span><span class="token3">(</span>$val<span class="token3">)</span> <span class="token3">{</span> <span class="token">//取出空格 </span> $val <span class="token1">=</span> <span class="token4">trim</span><span class="token3">(</span>$val<span class="token3">)</span><span class="token3">;</span> <span class="token">//获取字符串最后一个索引并且strtolower转小写</span> $last <span class="token1">=</span> <span class="token4">strtolower</span><span class="token3">(</span>$val<span class="token3">[</span><span class="token4">strlen</span><span class="token3">(</span>$val<span class="token3">)</span><span class="token1">-</span><span class="token6">1</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">switch</span><span class="token3">(</span>$last<span class="token3">)</span> <span class="token3">{</span> case <span class="token2">'g'</span><span class="token3">:</span> $val <span class="token1">*</span><span class="token1">=</span> <span class="token6">1024</span><span class="token3">;</span> case <span class="token2">'m'</span><span class="token3">:</span> $val <span class="token1">*</span><span class="token1">=</span> <span class="token6">1024</span><span class="token3">;</span> case <span class="token2">'k'</span><span class="token3">:</span> $val <span class="token1">*</span><span class="token1">=</span> <span class="token6">1024</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> $val<span class="token3">;</span> <span class="token3">}</span> ``` ``` **多文件上传** ``` <pre class="calibre17">``` <span class="token1"><</span><span class="token1">?</span>php $rootpath <span class="token1">=</span> <span class="token2">'http://localhost/atest/php/head'</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">)</span><span class="token3">{</span> $fieldname<span class="token1">=</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">count</span><span class="token3">(</span>$fieldname<span class="token3">[</span><span class="token2">'tmp_name'</span><span class="token3">]</span><span class="token3">)</span> <span class="token1">></span> <span class="token6">1</span><span class="token3">)</span><span class="token3">{</span> $upload_max_filesize<span class="token1">=</span><span class="token4">get_cfg_var</span><span class="token3">(</span><span class="token2">'upload_max_filesize'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//上传允许的单文件的最大值</span> $post_max_size<span class="token1">=</span><span class="token4">ini_get</span><span class="token3">(</span><span class="token2">'post_max_size'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//上传所有文件字节允许的最大值</span> $max_file_uploads<span class="token1">=</span><span class="token4">ini_get</span><span class="token3">(</span><span class="token2">'max_file_uploads'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//上传文件的允许最大数量</span> <span class="token">//设置允许上传的文件类型</span> $arr_ext <span class="token1">=</span> <span class="token3">[</span><span class="token2">'image/jpeg'</span><span class="token3">,</span><span class="token2">'image/png'</span><span class="token3">,</span><span class="token2">'application/zip'</span><span class="token3">]</span><span class="token3">;</span> <span class="token">//利用php_fileinfo.dll对MIME类型进行严格检查在php.ini开启</span> $fs <span class="token1">=</span> <span class="token4">finfo_open</span><span class="token3">(</span>FILEINFO_MIME_TYPE<span class="token3">)</span><span class="token3">;</span><span class="token">// 创建一个返回 mime 类型的资源</span> $customdir<span class="token1">=</span><span class="token4">strtotime</span><span class="token3">(</span><span class="token4">date</span><span class="token3">(</span><span class="token2">'Y-m-d'</span><span class="token3">,</span><span class="token4">time</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> $newdirpath <span class="token1">=</span> <span class="token4">dirname</span><span class="token3">(</span>__FILE__<span class="token3">)</span><span class="token3">.</span><span class="token2">'/uploads/'</span><span class="token3">.</span>$customdir<span class="token3">;</span> <span class="token">//判断文件夹是否存在不存在新建他</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span><span class="token4">is_dir</span><span class="token3">(</span>$newdirpath<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> $re <span class="token1">=</span> <span class="token4">mkdir</span><span class="token3">(</span>$newdirpath<span class="token3">,</span><span class="token6">0777</span><span class="token3">,</span><span class="token6">true</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span>$re<span class="token3">)</span><span class="token3">{</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'目录新建不成功'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//随便循环一个将 三维数组变为2维 以得到key</span> $totalsize<span class="token1">=</span><span class="token2">''</span><span class="token3">;</span> foreach <span class="token3">(</span>$fieldname<span class="token3">[</span><span class="token2">'tmp_name'</span><span class="token3">]</span> as $key <span class="token1">=</span><span class="token1">></span> $tmpfile<span class="token3">)</span> <span class="token3">{</span> <span class="token">//判断是否是HTTP POST上传的 </span> <span class="token5">if</span><span class="token3">(</span><span class="token4">is_uploaded_file</span><span class="token3">(</span>$fieldname<span class="token3">[</span><span class="token2">'tmp_name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> <span class="token">//判断错误</span> <span class="token5">if</span><span class="token3">(</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'error'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">!=</span><span class="token6">0</span><span class="token3">)</span><span class="token3">{</span> switch <span class="token3">(</span>$_FILES<span class="token3">[</span><span class="token2">'fieldname'</span><span class="token3">]</span><span class="token3">[</span><span class="token2">'error'</span><span class="token3">]</span><span class="token3">)</span> <span class="token3">{</span> case <span class="token6">1</span><span class="token3">:</span> echo $fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">.</span><span class="token2">'上传到文件超过了php.ini中设置的upload_max_filesize的值'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">2</span><span class="token3">:</span> echo $fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">.</span><span class="token2">'上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项限定的值'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">3</span><span class="token3">:</span> echo $fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">.</span><span class="token2">'文件只有部分被上传'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">4</span><span class="token3">:</span> echo $fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">.</span><span class="token2">'没有文件被上传'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">6</span><span class="token3">:</span> echo $fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">.</span><span class="token2">'找不到临时文件'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> case <span class="token6">7</span><span class="token3">:</span> echo $fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">.</span><span class="token2">'文件写入失败'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> default<span class="token3">:</span> echo $fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">.</span><span class="token2">'未知错误!'</span><span class="token3">;</span> <span class="token5">break</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//构建临时文件</span> $tmp_file<span class="token1">=</span>$tmpfile<span class="token3">;</span> <span class="token">//判断文件大小get_cfg_var或者ini_get都可以获取到ini的配置</span> <span class="token5">if</span><span class="token3">(</span>$fieldname<span class="token3">[</span><span class="token2">'size'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span> <span class="token1">></span> <span class="token4">return_bytes</span><span class="token3">(</span>$upload_max_filesize<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">'文件的大小超过了上传允许的单文件的最大值'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">count</span><span class="token3">(</span>$fieldname<span class="token3">[</span><span class="token2">'tmp_name'</span><span class="token3">]</span><span class="token3">)</span> <span class="token1">></span> <span class="token4">return_bytes</span><span class="token3">(</span>$max_file_uploads<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">'文件数量超过上传文件的允许最大数量'</span><span class="token3">;</span> <span class="token3">}</span> $totalsize <span class="token1">+</span><span class="token1">=</span> $fieldname<span class="token3">[</span><span class="token2">'size'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">;</span> <span class="token">//返回上传临时文件的mime类型</span> $mime <span class="token1">=</span> <span class="token4">finfo_file</span><span class="token3">(</span>$fs<span class="token3">,</span>$tmpfile<span class="token3">)</span><span class="token3">;</span> <span class="token">// 判断是否包括当前文件类型</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span><span class="token4">in_array</span><span class="token3">(</span>$mime<span class="token3">,</span>$arr_ext<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'上传的'</span><span class="token3">.</span>$fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">.</span><span class="token2">'文件类型错误'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//获取文件扩展名:至少有7种以上的方法自行百度</span> $ext <span class="token1">=</span> <span class="token4">strchr</span><span class="token3">(</span>$fieldname<span class="token3">[</span><span class="token2">'name'</span><span class="token3">]</span><span class="token3">[</span>$key<span class="token3">]</span><span class="token3">,</span><span class="token2">'.'</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//$name=$_FILES['fieldname']['name'];原文件名</span> $newname <span class="token1">=</span><span class="token4">uniqid</span><span class="token3">(</span><span class="token3">)</span><span class="token3">.</span>$ext<span class="token3">;</span> $uploadfile<span class="token1">=</span>$newdirpath<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$newname<span class="token3">;</span> <span class="token">//移动临时文件并保存为永久文件</span> $result <span class="token1">=</span> <span class="token4">move_uploaded_file</span><span class="token3">(</span>$tmpfile<span class="token3">,</span> $uploadfile<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span>$result<span class="token3">)</span><span class="token3">{</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'上传移动临时文件失败!!'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> echo <span class="token2">'上传成功'</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$uploadfile<span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'<div><img src=./uploads/'</span><span class="token3">.</span>$customdir<span class="token3">.</span><span class="token2">'/'</span><span class="token3">.</span>$newname<span class="token3">.</span><span class="token2">'></div>'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'location:http://localhost/atest/php/head/'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'非法文件'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">if</span><span class="token3">(</span>$totalsize <span class="token1">></span> <span class="token4">return_bytes</span><span class="token3">(</span>$post_max_size<span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">'所有上传文件的大小超过了允许的最大值'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> <span class="token4">die</span><span class="token3">(</span><span class="token2">'多文件上传不应该出现的这个未知错误'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> <span class="token4">header</span><span class="token3">(</span><span class="token2">'location:'</span><span class="token3">.</span>$rootpath<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * [return_bytes 返回给定的字节] * 注意这里的swith没有break;他会重命中的时候一直执行下去 * @param [string] $val [给定的k(千字节), M,G,...] * @return [int] [返回字节整数] */</span> <span class="token5">function</span> <span class="token4">return_bytes</span><span class="token3">(</span>$val<span class="token3">)</span> <span class="token3">{</span> <span class="token">//取出空格 </span> $val <span class="token1">=</span> <span class="token4">trim</span><span class="token3">(</span>$val<span class="token3">)</span><span class="token3">;</span> <span class="token">//获取字符串最后一个索引并且strtolower转小写</span> $last <span class="token1">=</span> <span class="token4">strtolower</span><span class="token3">(</span>$val<span class="token3">[</span><span class="token4">strlen</span><span class="token3">(</span>$val<span class="token3">)</span><span class="token1">-</span><span class="token6">1</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">switch</span><span class="token3">(</span>$last<span class="token3">)</span> <span class="token3">{</span> case <span class="token2">'g'</span><span class="token3">:</span> $val <span class="token1">*</span><span class="token1">=</span> <span class="token6">1024</span><span class="token3">;</span> case <span class="token2">'m'</span><span class="token3">:</span> $val <span class="token1">*</span><span class="token1">=</span> <span class="token6">1024</span><span class="token3">;</span> case <span class="token2">'k'</span><span class="token3">:</span> $val <span class="token1">*</span><span class="token1">=</span> <span class="token6">1024</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> $val<span class="token3">;</span> <span class="token3">}</span> ``` ```