2013-11-01 44 views
2

我有一個MySQL數據庫,用於存儲各種文件類型。如果文件擴展名是標準的三字符(.doc,.xls,.pdf),那麼內容類型存儲爲application/msword,application/ms-excel,application/pdf等。如果它是.docx或.xlsx ,那麼內容類型是application/vnd.openxmlformats-officedocument。Mozilla Firefox未正確從MySQL數據庫下載某些文件類型

直到最近,這從來都不是問題,但在過去的幾周內,它已成爲Firefox中的一個問題。 Firefox不會以正確的格式下載類型爲application/vnd.openxlmformats-officedocument的文件。相反,它會下載沒有擴展名的文件,用戶必須手動添加它。此外,如果文件名中有空格,那麼Firefox只會提取其中的第一個單詞,這就是文件的保存方式。

這裏是我用來上傳文件的代碼:

if($_FILES['Budget']['size'] > 0) 
    { 
    $fileName = $_FILES['Budget']['name']; 
    $tmpName = $_FILES['Budget']['tmp_name']; 
    $fileSize = $_FILES['Budget']['size']; 
    $fileType = $_FILES['Budget']['type']; 

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

    fclose($fp); 

    $fileUp = $con->prepare("INSERT INTO ptfs.upload (ProposalNo, name, size, type, content) VALUES(:proposalno,:name,:size,:type,:content)"); 
    $fileData=array('proposalno'=>$proposalNo,'name'=>$fileName,'size'=>$fileSize,'type'=>$fileType,'content'=>$content); 
    $fileUp->execute($fileData); 
    } 

這裏是呈現文件鏈接到用戶代碼:

if(isset($_GET['ProposalNo']) && isset($_GET['UID'])) 
    { 
    $fileget = $con->prepare("SELECT name, type, size, content FROM upload WHERE ProposalNo = :proposalno AND UID = :uid"); 
    $data = array('proposalno'=>$_GET['ProposalNo'],'uid'=>$_GET['UID']); 
    $fileget->execute($data); 
    list($name, $type, $size, $content) = $fileget->fetch(PDO::FETCH_BOTH); 

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

    exit; 
    } 

這除了火狐每個瀏覽器工作正常,正如我所說,這是一個最近的問題。我的用戶在最近幾周內開始報告它。我可以修改我的代碼或我的數據庫,以確保FF再次正確下載這些文件類型?

+0

帶名稱空格的文件應該用引號輸入到內容頭中:'Content -.....; filename =「file with spaces.txt」' –

+0

最好立即解決問題(*文件上傳並輸入到數據庫*之前),並用空格替換空格,然後讓PHP完成它的任務。這就是我所做的事情,從此以後從未讓我失望。 –

回答

2

「此外,如果文件名中有空格,那麼Firefox只會讀取其中的第一個單詞,這就是文件的保存方式。」


它總是全力抓住了問題的時候了(該文件被上傳並進入數據庫之前),並用下劃線代替空格,然後讓PHP做它的事之後。

考慮這是我用我上傳的文件的邏輯,這將改變如下:

This is a line

到:

This_is_a_line

<?php 
$string = "This is a line"; 
$arr = explode(" ",$string); 
$string = implode("_",$arr); 
echo $string; 
?> 

這從我自己取經歷與解決它相同的問題。

+0

嗯,這照顧了文件名的問題,但是Firefox不認識內容類型的問題呢? – Chris

+0

@Chris對此我不太確定。我已經看到其他人對Content-type使用變量(類似的方法);類似於你有'header(「Content-type:$ type」);'和95%的時間,最終被拉來自DB。 –

+0

是的,奇怪的是它只發生在Firefox中。 IE,Chrome,Safari和Opera都工作正常。 – Chris