php對uploads文件的處理問題的解決

解決uploads問題的要點有幾點:

參考這篇文章
第一,
在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


在表單數據回傳到服務器上時, 瀏覽器要對錶單中的數據進行編碼, enctype=EncodeType屬性就表示編碼類型

通常不須要寫, 就採用默認屬性了,
可是在上傳文件或pdf等時, 就必定要設置這個form屬性了,
共有三個值:
application/x-www-form-urlencoded: 表示將+編碼爲空格, 特殊字符用ascii的十六進制編碼. 這個就是form的默認編碼
multipart/form-data: 用於上傳文件,圖片等二進制內容時
text/plain: 用於上傳純文本內容, 而不是將form的input等控件的內容做爲html內容上傳數組

關於$_FILES 全局變量
在form表單中,能夠同時包含多個文件域, 每一個name都將做爲區分上傳文件的下標
$_FILES, 注意是files,複數, 因此, 它是全部的全局系統變量中, 如$_GET, $_POST, COOKIE ,SESSION等, 惟一的一個二維數組!
每一個下標, 表示一個上傳的文件的信息.
$_FILES['file1']包含5個元素:
error: 等於0 ,表示上傳成功, 1,2.3,4,5都表示錯誤:
name: 原來的名字,
type: 原來文件的mime類型
size: 文件大小, 以byte爲單位
tmp_name:臨時文件名.

mime:multipurpose internet mail extension: 多功能,多用途網絡/網際郵件擴展協議, 用在瀏覽器上表示多媒體的"打開"類型..,圖片的mime類型: image/gif, image/png, image/jpeg/pjpeg(ie)
tmp_name是上傳文件的臨時文件, php隨機生成的, 由於文件上傳後, 爲了安全! 並不容許直接放在 網站的目錄中, 必須對文件進行安全檢查等 操做後, 才容許 copy 使用(move_uploaded_file函數)到 站點的目錄中去.瀏覽器

move_upload_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>';
}

在windows中, 要解 move_uploaded_file()失敗的問題,

windows中, 權限應該不是問題,

問題是: 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)
第一個參數就是臨時文件名, 不用再加臨時路徑, ...

the whole code is the following:

<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>
相關文章
相關標籤/搜索