时间:2021-07-01 10:21:17 帮助过:18人阅读
话不多少,直入主题,在请求页面方面有两种写法(只呈现表单部分,以上传三个文件为例。)
- <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><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></span>
两个对比,发现仅仅是name的不同,第一个将name设置成数组的形式,而第二个则是我们通常设置也很容易想到的一种方法。
虽然表面上显示的仅仅有一点点不同,但真正提交到doAction.php页面的$_FILES则有很大不同。
第一种的$_FILES是一个三维数组,而第二种是二维数组,如下:
显然我们处理第二种格式的$_FILES更加方便。当然我们也可以想办法将第一种格式的$_FILES转化为第二种形式,如下:\
- <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>
通过这个函数,将$_FILES转化为下面格式:
此刻,两种上传方式已经处在同一起跑线了,下面的工作便是编写uploadFile()函数对每个文件进行上传,这也是本文的重点。
文件上传函数:
- <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>
其中还涉及了两个小函数:
- <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>
感受:
很久前接触过php文件上传,当时感觉一团乱麻。现在看来只要掌握$_FILES里面包含什么信息,利用自己写过的知识处理一些小技巧,系统有逻辑的加以考虑,适时地封装函数,以后文件上传就可以很快地展开。这次我展现的代码必然不是能满足任何需要,所以可以适当改造,成为自己的代码。比如如果要求上传文件是图片内容的话,单靠扩展名是绝对不能判断的,还需要利用图片的特性加以验证。
以上就介绍了php文件上传之多文件上传,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。