Php Mozilla Firefox无法从MySQL数据库正确下载某些文件类型

Php Mozilla Firefox无法从MySQL数据库正确下载某些文件类型,php,mysql,excel,firefox,Php,Mysql,Excel,Firefox,我有一个MySQL数据库,存储各种文件类型。如果文件扩展名是标准的三字符(.doc、.xls、.pdf),则内容类型存储为application/msword、application/ms excel、application/pdf等。如果是.docx或.xlsx,则内容类型为application/vnd.openxmlformats-officedocument 直到最近,这从来都不是一个问题,但在过去的几周里,它已经成为Firefox的一个问题。Firefox不会以正确的格式下载appli

我有一个MySQL数据库,存储各种文件类型。如果文件扩展名是标准的三字符(.doc、.xls、.pdf),则内容类型存储为application/msword、application/ms excel、application/pdf等。如果是.docx或.xlsx,则内容类型为application/vnd.openxmlformats-officedocument

直到最近,这从来都不是一个问题,但在过去的几周里,它已经成为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;
  }
这在除Firefox之外的所有浏览器中都能正常工作,正如我所说的,这是最近出现的一个问题。我的用户在过去几周内开始报告。我可以修改我的代码或数据库以确保FF再次正确下载这些文件类型吗?

“此外,如果文件名中有空格,Firefox只会选择其中的第一个单词,这就是文件的保存方式。”



最好立即发现问题(在文件上传并输入数据库之前),用下划线替换空格,然后让PHP完成它的工作

考虑以下逻辑,这是我用于上传文件的逻辑,它将转换:

这是一行

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

这是一条线

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


这是从我自己解决同一问题的经验中得出的。

名称中带有空格的文件应在内容标题中输入引号:
content-。。。。。;filename=“file with spaces.txt”
最好立即发现问题(在文件上传并输入数据库之前),并用下划线替换空格,然后让PHP完成它的工作。这就是我所做的,从那以后我就再也没有失望过。好吧,这解决了文件名的问题,但是Firefox不识别内容类型的问题呢?@Chris我不太确定。我见过其他人对
内容类型)使用变量(类似的方法)类似于您的
标题(“内容类型:$type”)和95%的时间,最终都是从DB中提取出来的。是的,奇怪的是,它只发生在Firefox中。IE、Chrome、Safari和Opera都运行良好。@Chris,就我记忆所及,也是如此。您使用的是哪个版本的FF?另外,您是否尝试过对
.docx
.xlsx
文件使用
application/msword、application/ms excel
来查看问题是否仍然存在?您的解决方案实际上解决了这两个问题。如果我把页面放进去后再刷新一下,会有帮助的!