2013-02-21 122 views
3

這是我無法弄清楚的一個問題:我已經在網頁上成功構建了一個上傳功能,將文件上傳到MySQL數據庫。當我在服務器上並通過phpMyAdmin打開它們時,它們都看起來很好...... txt,jpg,pdf等。試圖通過PHP/MySQL下載Blob

然而,將這個東西(下面)放在一起下載後,我遇到了一個奇怪的問題:在將擴展名更改爲'txt'後,所有文本文檔(以及所有其他類型的文件)都包含頁面本身的HTML代碼,其後是原始內容!

此外,POST後不同的瀏覽器顯示不同。當試圖下載一個txt文件,IE將顯示在頁面本身(不下載)並顯示錯誤消息的ECHO正確的數據之前它:

警告:頭可能並不比一個頭含有較多,檢測到新行。在C:\ WAMP \ WWW \上線ACE \ dmain.php 82

82號線是 '標題(「內容長度的......'

無論是火狐瀏覽器也沒有顯示任何東西他們只是。讓我下載

下面的代碼:

<?php 
if (isset($_POST['downloadid'])) { 
    $fileid = $_POST['downloadid']; 
    try { 
     $sql = "SELECT * FROM `datastore` WHERE `id` = '".$fileid."'"; 
     $results = $pdo->query($sql);echo $sql; 
     while ($row = $results->fetch()) { 
      $filename = $row['filename']; 
      $mimetype = $row['mimetype']; 
      $filedata = $row['filedata']; 
      header("Content-length: strlen($filedata)"); 
      header("Content-type: $mimetype"); 
      header("Content-disposition: download; filename=$filename"); //disposition of download forces a download 
      echo $filedata; 
      // die(); 
     } //of While 
    } //try 
    catch (PDOException $e) { 
     $error = '<br>Database ERROR fetching requested file.'; 
     echo $error; 
     die();  
    } //catch 
} //isset 
?> 
+3

哎呀。您正在使用PDO和_still_不具有綁定參數,並且使自己容易受到SQL注入的攻擊。 **請**(爲了您自己的利益)在PDO上查看'bindValue'和'prepare'。在更改標題之前,您也是'echo'SQL。這將導致標題不被髮送,除非輸出緩衝被啓用。 – 2013-02-21 18:34:31

+0

是啊...我是個壞男孩。這隻適用於一小部分員工的內部使用,但我明白了。將重寫那個。 – 2013-02-21 18:41:46

+0

即使在內部使用也很重要。沒有太多阻止員工離開時造成一些損害,如果這是代碼的編寫方式!我只是想幫助你。但是你的內部組織比你更瞭解我。 – 2013-02-21 18:43:49

回答

6

此:

header("Content-length: strlen($filedata)"); 

不會產生你所期望的。如果您查看wireshark中的標題,或查看請求的其他方法,您將看到它不包含整數。

用這個代替:

header("Content-length: ".strlen($filedata)); 
+0

感謝您的支持!我不再收到IE消息,但所有文件仍然在開頭添加了HTML代碼。 GAK。 – 2013-02-21 18:45:56

+0

您的代碼當前正在回顯SQL語句,在回顯文件數據之前是否還有其他輸出? – datasage 2013-02-21 18:47:59

+0

我發佈這個後,我刪除了echo $ sql。沒有運氣。在<?PHP標記之前還有其他輸出。 – 2013-02-21 18:54:19

0

苦苦思索其就地固定(即與HTML和其他代碼在同一頁上),我決定把它移動到一個專門的PHP後頁。之後,它運行良好。

感謝您的意見!