2013-05-13 71 views
-2

問題:move_uploaded_file:不允許使用tmp_name?

當您使用move_uploaded_file函數時,是否可以保留在tmp_name中創建的名稱?或者你必須總是把名字改成別的東西?

如果您可以保留您作爲tmp_name移動的文件的名稱,那麼您必須如何傳遞參數?我試了下面的代碼,我似乎無法讓它工作。

請參閱下面的代碼:。

if(isset($_POST['submit'])){ 
    $tmp_file = $_FILES['file_upload']['tmp_name']; 
    $target_file = basename($_FILES['file_upload']['name']); 
    $upload_dir = "uploads"; 

    if(move_uploaded_file($tmp_file, $upload_dir."/".$tmp_file)){ 
     $message = "File uploaded successfully."; 
    }else{ 
     $error = $_FILES['file_upload']['error']; 
     $message = $upload_errors[$error]; 
    } 
} 

當我傳遞的第二個參數作爲$ upload_dir「/」 $ TARGET_FILE,似乎沒有要任何的問題,但是當我把它作爲$ upload_dir 「/」 $ tmp_file如上面的代碼,它不斷給我下面的錯誤:。

SCREAM:錯誤抑制忽略

Warning: move_uploaded_file(uploads/C:\wamp\tmp\php1EA0.tmp): failed to open stream: Invalid argument in C:\wamp\www\bb2\uploads.php on line 26 
+0

我知道該文件正在被移動,並且我認爲自從我創建以來不應該有任何問題一個變量已經:$ tmp_file = $ _FILES ['file_upload'] ['tmp_name']。我想我可以使用該變量作爲move_uploaded_file()函數中的第二個參數。我哪裏錯了? – 2013-05-13 21:02:21

+1

嘗試使用'$ upload_dir。「/」。basename($ tmp_file)'$ tmp_file是該文件的完整路徑...您只需要我假設的名稱 – Orangepill 2013-05-13 21:05:31

+0

您是否嘗試過輸出實際值'$ tmp_file'和'$ upload_dir。「/」。$ tmp_file'?我敢打賭,你會得到像'uploads \ C:\ wamp ...'這樣的東西。 – likeitlikeit 2013-05-13 21:06:13

回答

4

tmp_name不是文件名,它是文件的完整路徑。

如果你只是想要一個隨機的文件名,我建議這樣的代碼:

$dest = $_FILES['file_upload']['name']; 
while (file_exists($dest)) { 
    $dest = $upload_dir . '/' . substr(sha1(rand()), 0, 10); 
} 

move_uploaded_file($_FILES['file_upload']['name'], $dest); 

rand()生成一個隨機的大數目。 sha1()使用它作爲種子創建一個更大的隨機十六進制字符串,我們不想要那麼大的東西,所以只抓住前10個字符左右。

+0

這是非常有幫助的。如果它是該文件的全名,並且我上傳的文件是jpg,那麼至少是否將它保存爲臨時文件作爲jpg?還是保存爲tmp? – 2013-05-13 21:09:41

+0

正如@Orangepill所說,我想我可以使用tmp_name的基名創建的名稱。如果由於某些原因,他們將jpg更改爲某種其他文件格式,我假設basename($ tmp_name)不起作用 – 2013-05-13 21:11:04

+1

您可以閱讀'$ _FILES []'數組以查看用戶計算機上的文件名是否以「 jpg「,你可以看到他們的瀏覽器是否發送了MIME類型的」image/jpeg「。然而,這兩種方法都不可靠,有時候它們不會存在或者會不正確(特別是當有人試圖破解你的服務器時......而且在非惡意的情況下)。 – 2013-05-13 21:20:48

0

如前所述您傳遞了錯誤的參數,第一個參數爲move_uploaded_file()以必須是字符串的文件名試試這個

extract(pathinfo($_FILES['file_upload']['tmp_name'])); 


if(move_uploaded_file($filename, $upload_dir."/".$tmp_file)){ 
    $message = "File uploaded successfully."; 
} 

http://php.net/manual/en/function.move-uploaded-file.php

http://php.net/manual/en/function.extract.php

+0

到目前爲止,我對第一個參數沒有任何問題。你能解釋一下你的意思嗎? – 2013-05-13 21:18:48