首頁 >後端開發 >php教程 >PHP---檔案上傳與下載

PHP---檔案上傳與下載

WBOY
WBOY原創
2016-08-08 09:27:47823瀏覽

轉自http://www.cnblogs.com/lazycat-cz/p/4113037.html

安全性能---水平不夠 ╮(╯_╰)╭

檔案上傳--->就是將本地的檔案上傳到伺服器上。 (HTTP協定有待學習)首先要在本地選擇上傳的文件,上傳到伺服器後,服務端又要做一些處理,為此客戶端和服務端均要做一些設定

(客戶端)文件上傳最基本的方法是透過form表單進行POST傳遞文件,先貼程式碼。

<html>
<body>

<form action="upload_file.php" method="post"  enctype="multipart/form-data">
<label <span>for</span>="file">选择文件:</label>
<input type="file" name="uploadFile" /> <br /><br><input type="submit" name="submit" value="上传" /> </form> </body> </html>

標籤的 enctype 屬性規定了在提交表單時要使用哪種內容類型。表單需要二進位資料時,例如檔案內容,請使用 "multipart/form-data"。

標籤的 type="file" 屬性規定了應該把輸入當作檔案來處理。舉例來說,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。

(服務端) 檔案上傳到了伺服器上還要經過一些處理過程。在php中,$_POST保存的是post傳遞的數據,而上傳檔案的相關資訊則保存在$_FILES裡邊,

<?<span>php
    </span><span>echo</span> '_FILES: <pre class="brush:php;toolbar:false">'<span>;
</span><span>//</span><span><pre class="brush:php;toolbar:false"> 标签的一个常见应用就是用来表示计算机的源代码。</span>
    <span>print_r</span>(<span>$_FILES</span><span>);
      
    </span><span>echo</span> '_POST: <pre class="brush:php;toolbar:false">'<span>;
    </span><span>print_r</span>(<span>$_POST</span><span>);
</span>?>

_FILES[]是二維數組。 array[uploadFile]鍵名取決於type="file"標籤中的的name值。它標記的是這個控件的上傳檔案訊息,因此我們可以放多個上傳控件,設定不同的name,當然設定一樣的name也可以,完全可以把它們全放在一個數組裡邊,如。 error表示錯誤,有這麼多情況,0:沒有錯誤,上傳成功;1:檔案超過了PHP設定指令中的upload_max_filesize規定的大小;2:檔案超過HTML表單中MAX_FILE_SIZE規定的大小,3:檔案只有部分上傳; 4:沒有文件上傳。 (size問題還沒有弄清楚╮(╯_╰)╭,就暫時先不做說明)

<?<span>php
    </span><span>$typeWhiteList</span> = <span>array</span>('txt', 'doc', 'php', 'zip', 'exe');   <span>//</span><span> 类型白名单,过滤不允许上传的文件类型</span>
    <span>$max_size</span> = 1000000;  <span>//</span><span> 大小限制 为1M</span>
    <span>$upload_path</span> = 'D:/WAMP';    <span>//</span><span> 指定移至的目录
     
    // 1、判断是否成功上传到服务器 </span>
    <span>$error</span> = <span>$_FILES</span>['uploadFile']['error'<span>];
    </span><span>if</span>(<span>$error</span> > 0<span>){
         </span><span>switch</span>(<span>$error</span><span>){
             </span><span>case</span> 1: <span>exit</span>('超过php配置的最大文件上传限制'<span>);
             </span><span>case</span> 2: <span>exit</span>('超过HTML表单的最大文件上传限制'<span>);
             </span><span>case</span> 3: <span>exit</span>('文件只有部分被上传'<span>);
             </span><span>case</span> 4: <span>exit</span>('没有上传任何文件'<span>);
             </span><span>default</span>: <span>exit</span>('未知类型错误'<span>);
         }
    }
     
    </span><span>//</span><span> 2、判断是否为允许上传的类型</span>
    <span>$extension</span> = <span>pathinfo</span>(<span>$_FILES</span>['uploadFile']['name'], PATHINFO_EXTENSION); <span>//</span><span> 获取扩展名</span>
    <span>if</span>(!<span>in_array</span>(<span>$extension</span>, <span>$typeWhiteList</span><span>)){
        </span><span>if</span>(<span>$extension</span> == ''<span>)
           </span><span>exit</span>('不允许上传空类型文件'<span>);
         </span><span>else</span> 
           <span>exit</span>('不允许上传'.<span>$extension</span>.'类型文件'<span>);
    } 
     
    </span><span>//</span><span> 3、判断是否为允许大小</span>
    <span>if</span>(<span>$_FILES</span>['uploadFile']['size'] > <span>$max_size</span><span>){
        </span><span>exit</span>('超过了允许上传到的'.<span>$max_size</span>.'字节'<span>);
    }
     
    </span><span>//</span><span> 4、已到指定位置</span>
    <span>$filename</span> = <span>date</span>('Ymd').<span>rand</span>(1000, 9999);   <span>//</span><span> 生成一个新文件名,防止覆盖</span>
    <span>if</span>(<span>is_uploaded_file</span>(<span>$_FILES</span>['uploadFile']['tmp_name'])){   <span>//</span><span> 判断是否通过HTTP POST上传</span>
        <span>if</span>(!<span>move_uploaded_file</span>(<span>$_FILES</span>['uploadFile']['tmp_name'], <span>$upload_path</span>.<span>$filename</span>.'.'.<span>$extension</span><span>)){
            </span><span>exit</span>('无法移动到指定位置'<span>);
         }
         </span><span>else</span><span>{
            </span><span>echo</span> '文件上传成功<br/>'<span>;
            </span><span>echo</span> '文件名: '.<span>$upload_path</span>.<span>$filename</span>.'.'.<span>$extension</span>.'<br>'<span>;
         }
    }
     </span><span>else</span><span>{
         </span><span>exit</span>('文件未通过合法途径上传'<span>);
     }</span>

上傳完成..............

檔案下載--->單的檔案下載只要用一個HTML連結就夠了,使用標籤,href屬性指定資源位置,一點就可。但這種方式只能處理瀏覽器預設無法辨識的MIME類型,(MIME具體附wiki百科http://zh.wikipedia.org/wiki/%E5%A4%9A%E7%94%A8%E9%80 %94%E4%BA%92%E8%81%AF%E7%B6%B2%E9%83%B5%E4%BB%B6%E6%93%B4%E5%B1%95)

<html>
    <head>
             <title>donwload <span>file</span></title>
             <meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
    </head>
    <body>
             <a href="resource/header.txt"><span>header</span>.txt</a><br/>
             <a href="resource/php.zip">php.zip</a><br/>
             <a href="resource/pic.ico">pic.ico</a>
           
    </body>
</html>

      對於這些瀏覽器不認識的類型文件,點鏈接,它直接彈框讓你下載,有的瀏覽器甚至直接就下了,那麼對於文本txt、jpg等瀏覽器默認識別的類型的文件,一點擊則會直接展現在頁面上,例如上面header.txt、pic.ico。如何不展示在頁面上而去下載它們呢,使用header函數。

      header函數會透過傳送頭訊息告知,請把該檔案當成一個附件,這樣點選的時候,就也會下載了。 (還不是非常理解,完全理解了再補充╮(╯_╰)╭)

     

哦了~                                        下一篇時中→_→

再次聲明轉載網址http://www.cnblogs.com/lazycat-cz/p/4113037.html

以上就介紹了PHP---檔案上傳與下載,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn