當我們想把文件上傳到web服務器上時,通常有如下幾種方法:
方法1、html(form)+nginx(文件上傳模塊)+php:這種方式最復雜。一般不用。實現過程說明如下:
步驟一:form中,action=“/upload”. 指定一個目錄,而不是一個文件。method都是POST.
步驟二:在nginx中,安裝文件上傳模塊進行編譯安裝。然后配置文件中,對/upload訪問目錄進行配置。指定相關參數。並指定后端處理文件上傳的php文件。經過nginx轉手,后端php獲取的參數就是nginx傳遞的,不是前端form過來的。
步驟三:后端php文件對傳遞過來的文件信息進行處理。需要配置php.ini,允許上傳文件。
以上實現的方法,在之前的html備份文件中存在。可以找到(html201908221746)。nginx的備份文件:nginx.conf201908242138。
方法2、html(form)+nginx+php:這種方式常見,配置比較簡單。
步驟一:form中,action=“/test.php”. 指定后端php文件,method都是POST.
步驟二:nginx只做為web服務存在
步驟三:php.ini中啟用文件上傳,指定文件臨時存儲路徑等等。
步驟四:php文件處理前端傳遞過來的上傳文件。
比如:
html:
<form enctype="multipart/form-data" action="test.php" method="post">
選擇文件:<input type="file" name="file" > <br>
<input type="submit" value="上傳">
php:
$uploaddir = '/tmp/test/' ;
$uploadfile = $uploaddir.basename ( $_FILES [ 'file' ][ 'name' ]);
if ( move_uploaded_file ( $_FILES [ 'file' ][ 'tmp_name' ], $uploadfile )) {
echo "File is valid, and was successfully uploaded.\n" ;
} else {
echo "Possible file upload attack!\n" ;
}
echo 'Here is some more debugging info:' ;
方法3、curl+nginx+php:這個和方法2類似。只是上傳文件客戶端方法變化。由html的form變成了curl。這就更方便了。
curl -F "file=@/etc/passwd" http://10.10.0.245/test.php
php:
$uploaddir = '/tmp/test/' ;
$uploadfile = $uploaddir.basename ( $_FILES [ 'file' ][ 'name' ]);
if ( move_uploaded_file ( $_FILES [ 'file' ][ 'tmp_name' ], $uploadfile )) {
echo "File is valid, and was successfully uploaded.\n" ;
} else {
echo "Possible file upload attack!\n" ;
}
echo 'Here is some more debugging info:' ;
注意:curl的file關鍵字和php中的$_FILES [ 'file' ][ 'tmp_name' ]中的file關鍵字對應。其實等同於form的input的name。
方法4、html(form)+js+nginx+php:這種方式體驗更好。前端上傳文件時,不需要刷新頁面,也不需要重新打開一個新的窗口。在當前窗口即可提示上傳文件結果。
其中方法4和其他方式的不同點是客戶端不同,前面3種方法都是通過web 瀏覽器提交文件上傳。需要交互操作。而方法4,就通過通過腳本實現上傳。可以解決不少問題。