PHP 上傳檔案 move_uploaded_file 報錯

weixin_34041003發表於2017-08-31

錯誤內容:

“Warning : move_uploaded_file(絕對路徑/供應商資料.xlsx): failed to open stream: Invalid argument”

試了下傳數字和字母,成功!於是考慮了當前是在windows下開發,windows下的預設編碼是gb2312,
所以需要將檔名的編碼格式轉了。

(轉)http://blog.csdn.net/candyguy242/article/details/20732601

在上傳檔案後,一般都會用 move_uploaded_file() 進行檔案移動改名。但是 move_uploaded_file() 並不支援 UTF-8 編碼,如果含有,那麼函式就會執行失敗,但是這個函式是支援 GB2312 或者是 GBK 編碼的,因此可以利用 iconv() 函式先進行名字轉換來來解決問題。有兩種情況:1. 伺服器是中文 Windows 環境在伺服器是中文 Windows 環境下,由於中文 Windows 系統的編碼是 GB2312,那麼可以如下使用程式碼:
[Plain Text]
$upload_file = iconv("UTF-8", "GB2312", $_FILES["myfile"]["name"]);
move_uploaded_file($_FILES["myfile"]["tmp_name"], $upload_file);

上面程式碼的意思是,先用 iconv() 函式對上傳檔名轉換為 GB2312 碼(上傳的檔名若含有中文,那麼使用 UTF-8 編碼),然後再進行 move_uploaded_file() 改名。這樣在中文系統下就可以正常顯示了。但是 Linux 系統本身就是使用 UTF-8 來編碼的,因此想要在 Linux 下正常顯示中文,那麼就再次 iconv() 轉換一下,這是下面所說的第 2 種情況。

  1. 伺服器是 Linux 系統
    如上面所講,利用 move_uploaded_file() 函式支援 GBK 的特性,那麼我們可以利用再次轉換的小技巧使上傳的檔名中含有中文的檔案在 Linux 下也能正常顯示中文名稱,如下面程式碼所示:
    if (move_uploaded_file($_FILES["myfile"]["tmp_name"],$upload_file))
    {
    $res_file= iconv("GBK","UTF-8",$upload_file);
    // 再從 GBK 轉為 UTF-8
    rename($upload_file,$res_file);
    // 重新命名一下檔案
    echo "<strong>upload ok</strong>
    ";
    }
    else
    {
    echo "upload failed";
    }
    ?>
執行輸出:

<1> 上傳一個檔名中含有中文的檔案:
<2> 檢查在 Linux 下是否正常顯示:正常。

解決 move_uploaded_file() 中文亂碼問題http://www.groad[.NET]
(http://lib.csdn.net/base/dotnet)/bbs/thread-7179-1-1.html(出處: 曲徑通幽論壇)

相關文章