2013-12-13 36 views
0

在我的網站中,我想允許用戶上傳文件(它們將存儲在數據庫中),然後允許它們在此之後下載上傳的文件。上傳過程沒有錯誤,它們被保存在二進制文件中。當從數據庫中檢索到文件時,文件被損壞

下載過程也可以,但下載的文件已損壞! 任何想法爲什麼?

上載代碼:

<?php require_once('Connections/databasestudents.php'); ?> 
<?php 

$fileName = $_FILES['file']['name']; 
$tmpName = $_FILES['file']['tmp_name']; 
$fileSize = $_FILES['file']['size']; 
$fileType = $_FILES['file']['type']; 

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

$studentId = $_POST['studentId']; 
fclose($fp); 

$query = "INSERT INTO file (studentId, fileName, fileType, fileContent) ". 
"VALUES ('$studentId', '$fileName', '$fileType', '$content')"; 

mysql_select_db($database_databasestudents, $databasestudents); 
mysql_query($query) or die('Error, query failed'); 

header("Location: students.php"); 
die(); 

?> 

的下載代碼:

<?php require_once('Connections/databasestudents.php'); ?> 
<?php 
mysql_select_db($database_databasestudents, $databasestudents); 
$query = 'SELECT fileName, fileContent, fileType, LENGTH(fileContent) as fileSize from file WHERE id="'. $_GET ['id'].'";'; 

$Recordset1 = mysql_query($query, $databasestudents) or die(mysql_error()); 
$row_Recordset1 = mysql_fetch_assoc($Recordset1); 

$result = mysql_query($query); 
$row = mysql_fetch_array($result, MYSQL_BOTH); 
$size = $row['fileSize']; 
$type = $row['fileType']; 
$name =$row['fileName']; 
$fileContent = $row['fileContent']; 
echo $size . "". $type . " ". $name; 

header("Content-length: $size"); 
header("Content-type: $type"); 
header("Content-Disposition: attachment; filename=$name"); 
echo $fileContent; 

mysql_close(); 
?> 
+1

你爲什麼要在第一時間上傳你的數據庫中的文件,而不是他們的道路? –

+0

表名:文件。字段:fileContent。類型:longblob – HaneenSu

+0

我不知道該怎麼做:s – HaneenSu

回答

2
  1. 使用PDO和準備語句。這可能會解決這個問題,它將修復下載代碼中的SQL注入漏洞(目前它允許人們破解你的數據庫)。

  2. PDO具有「大對象」(LOB)支持,意味着您正在執行的操作。它會比你現在做的更有效率。 documentation提供了很好的示例代碼,可以完全或多或少地實現您想要的功能。

1

我已經想通了強制..從下載的代碼刪除此行:

echo $size . "". $type . " ". $name; 
+0

下載代碼中仍然有SQL注入,代碼效率非常低。請考慮使用PDO - 我在答案中鏈接的示例代碼幾乎就是您需要的,所以它不應該太多工作​​。 –

+0

以及我想,但我是新來的PHP和SQL,我不知道如何修改代碼..我擔心我會摧毀現在的工作 – HaneenSu

+0

在你之前製作你的代碼的副本改變一切,然後嘗試 - 這是學習的最佳方式!如果你不明白,請查看http://www.php.net/上的文檔(你可能應該閱讀一些關於PDO的內容 - 查看例子並試着理解它們,現在很難說它會有幫助你在未來很多 - 這是值得的!) –