2

我有一个 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 再次正确下载这些文件类型吗?

4

1 回答 1

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;
?>

这取自我自己的经验,解决了同样的问题。

于 2013-11-01T18:49:10.697 回答