2012-06-08 130 views
11

我試圖讓PHP將上傳的文件從tmp目錄移動到永久在我的web服務器上的某個地方。這看起來很簡單,但我得到這個錯誤:PHP:move_uploaded_file()無法打開流:沒有這樣的文件或目錄

Unable to move 'C:\UniServer\tmp\php3F62.tmp' to 'static/images/slides/1/1.jpg'

漂亮的直線前進,對不對?它無法找到目標文件夾。

我的問題是:如何引用所需的目標目錄?

相對於腳本在服務器上的位置的引用嗎?或者它是相對於URL?或者PHP DOCUMENT_ROOT?或者操作系統的文件系統?或者是其他東西?

我無法找到PHP文件中或實際上,任何類似的問題在這裏所以答案..

誰能幫助?謝謝。

+0

它形成腳本在服務器上的位置。在任何時候最好使用絕對路徑 –

+2

在路徑上使用'DIRECTORY_SEPARATOR'常量以使其與平臺無關。 –

+0

經常遇到此錯誤,並快速排除故障,請執行以下步驟:https://stackoverflow.com/a/36577021/2873507 –

回答

26

一個簡單的方法,以保持道路的軌跡就是在你的index.php定義的絕對路徑

define ('SITE_ROOT', realpath(dirname(__FILE__))); 

然後,只需使用它像:

move_uploaded_file($_FILES['file']['tmp_name'], SITE_ROOT.'/static/images/slides/1/1.jpg'); 
+0

這也是我的做法。這比使用doc根更好,因爲這樣,你可以將你的應用程序放在子目錄 –

+0

這是正確的解決方案,謝謝!(這有點令人擔心,有幾個人認爲DIRECTORY_SEPARATOR會提供幫助,雖然: - /) –

+0

我從來沒有使用它,id只有在我要輸出路徑給用戶時才使用它。感謝您的接受:) –

0

這是從腳本在服務器上的位置!而且,你需要有這個文件夾的寫權限:

'static/images/slides/1/1.jpg' 

相反,它是更好地使用絕對路徑是這樣的:

'C:\UniServer\***\static\images\slides\1\1.jpg 

使用絕對路徑。

+2

PHP在所有操作系統中都接受\和/作爲有效路徑分隔符。 –

+0

@DjangoReinhardt感謝您的信息,但只是要格外小心,瞭解操作系統。 :) –

+0

downvote的原因是什麼? –

2

我有同樣的問題與我的上傳。看我的例子,也許它可以幫助你。

我創建的文件名爲「uploads」。

$uploads_dir = 'uploads/'; 
$name = $_FILES['userfile']['name']; 
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) 
{  
    //in case you want to move the file in uploads directory 
    move_uploaded_file($_FILES['userfile']['tmp_name'], $uploads_dir.$name); 
    echo 'moved file to destination directory'; 
    exit; 
} 
0
$destination = dirname(dirname(dirname(dirname(__FILE__))))."/runtime/tmp/"; 
chown($destination, 0755); 
move_uploaded_file($info['tmp_name'], $destination.$info['name']); 

這是我的解決方案,我只是要用mkdir創建一個目錄來把我的照片,我不想動。 希望它有幫助。

相關問題