php檔案上傳之多文件上傳

WBOY
發布: 2016-08-08 09:20:07
原創
834 人瀏覽過

   在胡說八道之前,首先聲明,本文是建立在掌握php單文件上傳的基礎上,所以這裡就不贅述文件上傳伺服器配置,表單設定該注意的地方了。

   話不多少,直入主題,在請求頁面方面有兩種寫法(只呈現表單部分,以上傳三個文件為例。)

<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>
登入後複製

   兩個不同,發現僅僅是兩個不同的對比,發現只有兩個不同   ,第一個將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檔案,當時已經接觸過php」。現在看來只要掌握$_FILES裡麵包含什麼訊息,利用自己寫過的知識處理一些小技巧,系統有邏輯的加以考慮,適時地封裝函數,以後文件上傳就可以很快地展開。這次我展現的程式碼必然不是能滿足任何需要,所以可以適當改造,成為自己的程式碼。例如如果要求上傳檔案是圖片內容的話,單靠副檔名是絕對不能判斷的,還需要利用圖片的特性來驗證。

以上就介紹了php檔案上傳之多檔案上傳,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!