2013-10-28 53 views
0

我是一名PHP初學者,我正嘗試將PDF上傳到我的MySQL數據庫。我試圖添加一些代碼,使其兼容pdf,但它沒有工作,所以我刪除它,我有PHP腳本,可以上傳.txt,word文檔,圖像等,但不是PDF。你建議我應該添加什麼,所以它適用於PDF。這是我的腳本。我無法上傳PDF到我的mysql數據庫

<html> 
<head></head> 
<body> 
<form method="post" enctype="multipart/form-data"> 
<table width="350" border="0" cellpadding="1" 
cellspacing="1" class="box"> 
<tr> 
<td>Select a file to upload</td> 
</tr> 
<tr> 
<td> 
<input type="hidden" name="MAX_FILE_SIZE" 
value="16000000"> 
<input name="userfile" type="file" id="userfile"> 
</td> 
</tr> 
<tr> 
<td width="80"><input name="upload" 
type="submit" class="box" id="upload" value=" Upload "></td> 
</tr> 
</table> 
</form> 
</body> 
</html> 
<?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']; 
$fileType=(get_magic_quotes_gpc()==0 ? mysql_real_escape_string(
$_FILES['userfile']['type']) : mysql_real_escape_string(
stripslashes ($_FILES['userfile']))); 
$fp  = fopen($tmpName, 'r'); 
$content = fread($fp, filesize($tmpName)); 
$content = addslashes($content); 
fclose($fp); 
if(!get_magic_quotes_gpc()) 
{ 
    $fileName = addslashes($fileName); 
} 
$con = mysql_connect('localhost', 'root', '') or die(mysql_error()); 
$db = mysql_select_db('test', $con); 
if($db){ 
$query = "INSERT INTO upload (name, size, type, content) ". 
"VALUES ('$fileName', '$fileSize', '$fileType', '$content')"; 
mysql_query($query) or die('Error, query failed'); 
mysql_close(); 
echo "<br>File $fileName uploaded<br>"; 
}else { echo "file upload failed"; } 
} 
?> 
+0

你在哪裏檢查文件類型?我沒有看到你的代碼。 – putvande

+0

什麼字段類型是您的「內容」列?文本?它可能不足以存儲整個pdf內容(TEXT只能包含65,535字節的數據)。你爲什麼不把文件上傳到服務器並在數據庫中保存它的路徑? – davey

+2

爲什麼你想要在數據庫中的文件?爲什麼不正常上傳到一個正常的目錄,並將路徑存儲在數據庫中,這是一個錯誤,我也在我的早期編程年 – Lappies

回答

0

您應該將其存儲爲二進制數據。所以列類型BLOB(或MEDIUMBLOB等,取決於文件的大小 - 以及用戶可以上傳多少)。因此,存儲幾乎任何類型的文件內容都不是問題。

此外,我不認爲你應該在內容中添加斜槓並直接在查詢中插入值,而是考慮使用參數。閱讀PHP數據對象(PDO:http://php.net/manual/en/book.pdo.php),這是一個非常好的和安全的(如果使用正確!)擴展名與數據庫交互。

0

魔術報價已被棄用了很長時間。你不應該再使用它了。自PHP 5.4起,它是removed from the language。尤其是,在編寫新腳本時,應該避免這種被遺棄的功能。

如果您的文件很大,需要使用PHP文件上傳腳本進行處理,您可能有興趣更改設置,如post_max_size。有關更多詳細信息,請參閱以下主題:Increasing the maximum post size

而不是通用文本處理函數addslashes您應該使用與您的數據庫系統匹配的轉義函數。在這種情況下,它是mysqli_real_escape_string。 由於PDF文件包含二進制數據並且沒有文本,因此您不應在保存和讀取(文本處理)後添加和刪除斜槓。將數據插入數據庫時​​,只需使用足夠的MySQL函數即可轉義二進制內容blob。 適用於整個文件的列類型是MEDIUMBLOB。它允許數據長度高達〜16 MB。

在談到php方面之後,還提供了一些關於MySQL的提示。 MySQL限制了發送給它的數據包的長度。如果您使用共享主機平臺(並且不使用專用服務器),那麼機會僅限於1 MB。相關的配置選項是max_allowed_packet。此設置將限制將文檔存儲在數據庫中的能力。有關如何解決此問題的建議,請參閱this thread

在我看來,在大多數情況下,將整個文檔存儲到關係數據庫是一個壞主意。我通常將文件元數據(大小,文件名,MIME類型,......)放入數據庫表中,並將上傳的二進制數據存儲在公衆無法讀取的普通文件系統目錄中(例如/srv/uploads)。然後你的文件可以變得像你想要的那麼大,而不會犧牲數據庫的性能。

相關問題