參考這篇文章
第一,
在php.ini文件中, 有file_uploads這一節
file_uploads = On ;是否開啓文件上傳功能, 該功能有很大的安全問題, 須要進行身份權限驗證而後才容許上傳
upload_tmp_dir = 'c:/wamp/tmp' ;若是沒有設置, 就使用系統默認的臨時目錄
upload_max_filesize = 2M
**注意upload(s)的寫法.php
第二,
還要注意 post 自己 容許傳送表單的最大數據: post_max_size = 8M 默認的是8M, 若是上面的upload_max_filesize=10M ,
這裏也只會傳送8M的最大文件, 一般要設置成: post_max_size 大於> upload_max_filesize.css
第三,
還要注意腳本執行的時間限制, 由於上傳文件 的時間對大文件, 可能須要的時間是比較長的, 因此, 要設置
max_execution_time = 0, 默認的是 30secondhtml
;;;;;;;;;;;;;;;;;;; ; Resource Limits ; ;;;;;;;;;;;;;;;;;;; max_execution_time = 30 ; Maximum execution time of each script, in seconds max_input_time = 60 ; Maximum amount of time each script may spend parsing request data memory_limit = 256M ; Maximum amount of memory a script may consume (8MB)
第四,
max_input_time 以秒爲單位對經過POST、GET以及PUT方式接收數據時間進行限制。
若是應用程序所運行環境處在低速鏈路上,則須要增長此值以適應接收數據所需的更多時間linux
memory_limitapache
因此, 綜上所述, 就是對上傳文件, 通常有類型和文件大小的限制, 這也理解文件上傳的大小通常不超過2M .windows
通常不須要寫, 就採用默認屬性了,
可是在上傳文件或pdf等時, 就必定要設置這個form屬性了,
共有三個值:
application/x-www-form-urlencoded: 表示將+編碼爲空格, 特殊字符用ascii的十六進制編碼. 這個就是form的默認編碼
multipart/form-data: 用於上傳文件,圖片等二進制內容時
text/plain: 用於上傳純文本內容, 而不是將form的input等控件的內容做爲html內容上傳數組
mime:multipurpose internet mail extension: 多功能,多用途網絡/網際郵件擴展協議, 用在瀏覽器上表示多媒體的"打開"類型..,圖片的mime類型: image/gif, image/png, image/jpeg/pjpeg(ie)
tmp_name是上傳文件的臨時文件, php隨機生成的, 由於文件上傳後, 爲了安全! 並不容許直接放在 網站的目錄中, 必須對文件進行安全檢查等 操做後, 才容許 copy 使用(move_uploaded_file函數)到 站點的目錄中去.瀏覽器
是由於apache中的權限問題
而upload_tmp_dir中的文件, 老是在腳本執行完畢後, 就把這些上傳的臨時文件給刪除了的.因此你是看不到的.
由於apache自己作了權限設置, 只容許php程序瀏覽 網站跟目錄, 不容許瀏覽服務器硬盤目錄.安全
配置選項:(這個是在linux中)
php_admin_value open_basedir localhost/wish/
php_admin_value upload_tmp_dir localhost/wish/tmp服務器
php的echo能夠輸出script腳本, 如:
$old_file = ""; $old_file = "/folder/file.WAV";//這裏是須要替換的文件,不在apache的目錄下,是全局目錄,絕對路徑,folder是755權限,file的權限是644 $file = $_FILES['file']['tmp_name']; if(is_uploaded_file($file)){ if(@move_uploaded_file($_FILES['file']['tmp_name'], $old_file)){ echo '<script>alert("替換成功");window.location="index.php";</script>'; }else{ echo '<script>alert("替換失敗");window.location="index.php";</script>'; } }else{ echo '<script>alert("上傳失敗");window.location="index.php";</script>'; }
問題是: move...函數的目標路徑/文件名 參數, 中的目標路徑, 應該是: 絕對路徑!
絕對路徑要用 __FILE__來得到, 而不是用 $_SERVER['SCRiPT_NAME']
函數是dirname, 不是basedir!
用$app_path = dirname (FILE). 就得到絕對路徑 而後目標參數就用: $app_path. '/uploads'. $old_name.
$_SERVER['scRIT_NAME']獲得的是 相對 網站的根路徑: "/APP/..." 這個是相對路徑, 要出錯!!
move_uploaded_file($_FILES['upfile']['temp_name'], $app_path.'/uploads/'.$old_name)
第一個參數就是臨時文件名, 不用再加臨時路徑, ...
<title>無標題文檔</title> <style type="text/css"> .error { font-size: 16px; color: red; background: #FC3; border: 1px dotted #60F; height: 50px; width: 800px; line-height: 50px; text-align: center; } </style> </head> <body> <form method="post" enctype="multipart/form-data"> <input type="file" name="upfile"> <br/> <input type="submit" value="upload"> </form> <pre> <?php $app_path = dirname(__FILE__); $uf = $_FILES['upfile']; if($uf['error'] == 0) { $name = $uf['name']; if(($uf['type'] != 'image/gif' && $uf['type'] != 'image/png' && $uf['type'] != 'image/jpeg' && $uf['type'] != 'image/pjpeg' ) || $uf['size'] > 2000000){ echo '<p class="error">Error: the type of file uploaded is not image or filesize is more than 2M'.'</p>'; exit; }else{ echo "uploaded file's name is: ".$name.'<br/>'; echo 'the size of file uploaded is : '. (round($uf['size']/1024/1024,2)).'MB<br/>'; } /* Note: In function 'iconv' below, the first parameter must be utf-8, * and cann't be utf8! */ if(move_uploaded_file($uf['tmp_name'], $app_path.'\\myuploaded\\'.iconv('utf-8','gb2312//ignore',$name))){ echo 'uploading file is completed successfully'.'<br/>'; }else{ echo '<p class="error"> Warning: uploading file is failed</p>'; } }else{ echo '"<p class="error">error: file uploading is failed: '.$uf['error'].'</p>'; } ?> </pre> </body>