我有一个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再次正确下载这些文件类型吗?
答案 0 :(得分: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;
?>
这取决于我自己对解决它的同一问题的经验。