Before talking nonsense, let me first state that this article is based on mastering PHP single file upload, so I will not go into details about the file upload server configuration and form settings here.
Not much to say, let’s get straight to the point. There are two ways to write the request page (only the form part is presented, taking uploading three files as an example.)
<span><</span><span>form </span><span>action</span><span>="doAction.php"</span><span> method</span><span>="post"</span><span> enctype</span><span>="multipart/form-data"</span><span>></span><span> 请选择我的上传文件 </span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfile[]"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfile[]"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfile[]"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="submit"</span><span> value</span><span>="上传"</span><span>/></span><span></</span><span>form</span><span>></span>
<span><</span><span>form </span><span>action</span><span>="doAction.php"</span><span> method</span><span>="post"</span><span> enctype</span><span>="multipart/form-data"</span><span>></span><span> 请选择我的上传文件 </span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfil1"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfil2"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfil3"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="submit"</span><span> value</span><span>="上传"</span><span>/></span><span></</span><span>form</span><span>></span>
Comparing the two, it is found that the only difference is the name , the first one sets the name into the form of an array, and the second one is a method that we usually set and can easily think of.
Although there is only a little difference displayed on the surface, the $_FILES actually submitted to the doAction.php page is very different.
The first type of $_FILES is a three-dimensional array, while the second type is a two-dimensional array, as follows:
Obviously it is more convenient for us to deal with the second format of $_FILES. Of course, we can also find a way to convert $_FILES in the first format into the second form, as follows:
<span>function</span><span> getFiles(){ </span><span>foreach</span>(<span>$_FILES</span><span>as</span><span>$file</span><span>){ </span><span>$fileNum</span>=<span>count</span>(<span>$file</span>['name'<span>]); </span><span>if</span> (<span>$fileNum</span>==1<span>) { </span><span>$files</span>=<span>$file</span><span>; }</span><span>else</span><span>{ </span><span>for</span> (<span>$i</span>=0; <span>$i</span> < <span>$fileNum</span>; <span>$i</span>++<span>) { </span><span>$files</span>[<span>$i</span>]['name']=<span>$file</span>['name'][<span>$i</span><span>]; </span><span>$files</span>[<span>$i</span>]['type']=<span>$file</span>['type'][<span>$i</span><span>]; </span><span>$files</span>[<span>$i</span>]['tmp_name']=<span>$file</span>['tmp_name'][<span>$i</span><span>]; </span><span>$files</span>[<span>$i</span>]['error']=<span>$file</span>['error'][<span>$i</span><span>]; </span><span>$files</span>[<span>$i</span>]['size']=<span>$file</span>['size'][<span>$i</span><span>]; } } } </span><span>return</span><span>$files</span><span>; }</span>
Through this function, $_FILES is converted into the following format:
At this moment, two uploads The methods are already at the same starting line. The next task is to write the uploadFile() function to upload each file, which is also the focus of this article.
File upload function:
<span>function</span> uploadFile(<span>$file</span>,<span>$path</span>='./uploads',<span>$max_size</span>,<span>$allowExt</span><span>){ </span><span>$filename</span>=<span>$file</span>['name'<span>]; </span><span>$type</span>=<span>$file</span>['type'<span>]; </span><span>$temp_name</span>=<span>$file</span>['tmp_name'<span>]; </span><span>$error</span>=<span>$file</span>['error'<span>]; </span><span>$size</span>=<span>$file</span>['size'<span>]; </span><span>if</span> (<span>$error</span>==<span>UPLOAD_ERR_OK) { </span><span>if</span> (<span>$size</span>><span>$max_size</span><span>) { </span><span>$res</span>['mes']=<span>$filename</span>."文件超过规定上传大小"<span>; } </span><span>$ext</span>=getExt(<span>$filename</span><span>); </span><span>if</span> (!<span>in_array</span>(<span>$ext</span>, <span>$allowExt</span><span>)) { </span><span>$res</span>['mes']=<span>$filename</span>.'文件名不合乎规范'<span>; } </span><span>if</span> (!<span>is_uploaded_file</span>(<span>$temp_name</span><span>)) { </span><span>$res</span>['mes']=<span>$filename</span>."文件不是通过HTTP POST 方法上传上传过来的"<span>; } </span><span>if</span> (@<span>$res</span><span>) { </span><span>return</span><span>$res</span><span>; } </span><span>if</span> (!<span>file_exists</span>(<span>$path</span><span>)) { </span><span>mkdir</span>(<span>$path</span>,0777,<span>true</span><span>); </span><span>chmod</span>(<span>$path</span>, 0777<span>); } </span><span>$fname</span>=<span>getUniName(); </span><span>$destination</span>=<span>$path</span>.'/'.<span>$fname</span>.'.'.<span>$ext</span><span>; </span><span>if</span> (<span>move_uploaded_file</span>(<span>$temp_name</span>, <span>$destination</span><span>)) { </span><span>$res</span>['mes']=<span>$filename</span>.'上传成功'<span>; </span><span>$res</span>['dest']=<span>$destination</span><span>; }</span><span>else</span><span>{ </span><span>$res</span>['mes']=<span>$filename</span>."文件上传失败"<span>; } }</span><span>else</span><span>{ </span><span>switch</span> (<span>$error</span><span>) { </span><span>case</span> '1': <span>$res</span>['mes']="超过了配置文件上传文件的大小"<span>; </span><span>break</span><span>; </span><span>case</span> '2': <span>$res</span>['mes']="超过表单设置上传文件文件的大小"<span>; </span><span>break</span><span>; </span><span>case</span> '3': <span>$res</span>['mes']="文件部分被上传"<span>; </span><span>break</span><span>; </span><span>case</span> '4': <span>$res</span>['mes']="没有文件被上传"<span>; </span><span>break</span><span>; </span><span>case</span> '6': <span>$res</span>['mes']="没有找到临时目录"<span>; </span><span>break</span><span>; </span><span>case</span> '7': <span>$res</span>['mes']="文件不可写"<span>; </span><span>break</span><span>; </span><span>default</span>: <span>$res</span>['mes']="上传文件失败"<span>; </span><span>break</span><span>; } } </span><span>return</span><span>$res</span><span>; }</span>
It also involves two small functions:
<span>/*</span><span>* * 获得文件扩展名 * @param string $filename 上传文件名 * @return string 返回扩展名 </span><span>*/</span><span>function</span> getExt(<span>$filename</span><span>){ </span><span>$arr</span>=<span>explode</span>('.', <span>basename</span>(<span>$filename</span><span>)); </span><span>return</span><span>end</span>(<span>$arr</span><span>); } </span><span>/*</span><span>* * 获得文件唯一扩展名 * @return string 经过md5后生成32位唯一的上传文件名 </span><span>*/</span><span>function</span><span> getUniName(){ </span><span>return</span><span>md5</span>(<span>uniqid</span>(<span>microtime</span>(<span>true</span>),<span>true</span><span>)); }</span>
Feeling:
I came into contact with php file uploading a long time ago, and it felt like a mess at the time. Now it seems that as long as you understand the information contained in $_FILES, use the knowledge you have written to deal with some tips, the system will consider it logically, and encapsulate the functions in a timely manner, then file upload can be carried out quickly. The code I show this time will definitely not meet any needs, so it can be modified appropriately and become your own code. For example, if the uploaded file is an image, it cannot be determined by the extension alone. It also needs to be verified by using the characteristics of the image.
The above introduces PHP file upload and multi-file upload, including aspects of content. I hope it will be helpful to friends who are interested in PHP tutorials.