2009-02-23 178 views
0

我試圖使用PHP將它們保存爲二進制形式到我的MySQL數據庫將文件上傳到我的服務器,但我不能讓它的工作,這裏是我使用的腳本,我相信它有什麼做「$ _FILES」,因爲我藉此出來的時候「& & $ _FILES [‘userfile的’] [‘大小’]> 0」的劇本開始運行,但隨後即用「$ _FILES」下的變量不是定義。PHP文件上傳

if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) { 
$fileName = $_FILES['userfile']['name']; 
$tmpName = $_FILES['userfile']['tmp_name']; 
$fileSize = $_FILES['userfile']['size']; 
$fileType = $_FILES['userfile']['type']; 

$fp  = fopen($tmpName, 'r'); 
$content = fread($fp, filesize($tmpName)); 
$content = addslashes($content); 
fclose($fp); 

if(!get_magic_quotes_gpc()) 
{ 
    $fileName = addslashes($fileName); 
} 

db_connect(); 
db_select(); 

$query = "INSERT INTO upload (name, size, type, content) ". 
"VALUES ('$fileName', '$fileSize', '$fileType', '$content')"; 

mysql_query($query) or die('Error, query failed'); 
db_disconnect(); 

echo "<br>File $fileName uploaded<br>"; 
} 
+1

將很方便檢查var_dump($ _ FILES)的輸出以準確查看內容。 – rojoca 2009-02-23 21:34:29

回答

3

這是一個2折的過程,首先上傳本身,然後在服務器上進行操作。首先驗證是確保文件甚至被上傳。對於您可以行

$fileName = $_FILES['userfile']['name']; 

使用後使用:

if(is_uploaded_file($fileName)) { 
    // Here goes all the file manipulation/storage/etc 
} else { 
    echo 'Error: File could not be uploaded.'; 
} 

嘗試使用,也許重新發布該文件實際上是上傳。僅僅因爲$ _FILES有內容,並不一定意味着文件已經上傳到服務器。

1

我假設您發佈的字段名爲「userfile」?

此外,這是沒有直接密切相關的問題,但它通常被認爲是一個更好的做法存儲在文件系統中,而不是在MySQL文件。文件系統被設計爲存儲大塊的二進制數據,而數據庫則不是。

+0

我首先將文件存儲在文件系統中,但試過這樣做以確保錯誤與服務器不允許上傳或其他內容有關。 – Ryan 2009-02-23 15:50:14

2

如果你上傳的文件用一種形式,它有一個 'ENCTYPE = 「的multipart/form-data的」' 中的 「形式」 的標籤?

1

我從你的榜樣,你的輸入名字是upload承擔。 <input type="file" /> PHP中的結果未在$_POST中排序,而是在$_FILES中排序。該文檔使用$_FILES['userfile']作爲示例字段,但是如果您的輸入被聲明爲<input type="file" name="upload" />,則應該簡單地使用$_FILES['upload']

+0

這是我的表單代碼: Ryan 2009-02-23 16:20:12

0

嘗試使print_r($ FILES)並定義是什麼問題。 也許窗體不需要類型?