如何在PHP中下载没有扩展名的文件


How to download a file without an extension in PHP

我有一个没有扩展名的文件,但我知道它是tiff。我希望能够通过PHP下载这个文件。

我创建了一个链接到另一个php页面的页面,其中包含以下内容:

<?php
$imgPath = 'http://server/23700-b074137f-eb5c-45d6-87c2-13c96812345b';
 header("Content-disposition: attachment; filename=invoice.tiff");
 header("Content-type: image/tiff");
 readfile($imgPath);
?>

当我点击链接时,我会得到下载invoice.tiff的提示,但它是0字节。但是,如果我将服务器上的文件重命名为23700-b074137f-eb5c-45d6-87c2-13c96812345b.tiff(并更改$imgPath),它就可以工作了。

如何在不重命名文件以包含扩展名的情况下完成此操作?

可能'tiff'扩展名在服务器上注册为已知文件类型,因此当您重命名并请求tiff时,它的权限将允许您打开它。但是,如果没有扩展名,安全性可能会阻止您读取它,正如上面'Mike B'所说。要检查这一点,只需在浏览器地址栏中输入文件名,看看它是否打开,扩展名是否为"tiff"。除了更改服务器的安全性之外,没有解决安全问题的方法,这将非常糟糕。

您正在从URL检索文件,因此激活了readfile中的"fopen wrappers"。一般来说,您不应该这样做,尤其是在本地工作时,因为它会调用大量不必要的开销和(在这种情况下)不必要的"魔法"行为。

只需在文件的本地路径上使用readfile,就可以了,或者使用die(file_get_contents($imgPath))而不是最后一行来规避PHP的本地行为。

它对我有效:

$imgPath = 'http://server/23700-b074137f-eb5c-45d6-87c2-13c96812345b';
$f = fopen($imgPath, "r");
header("Content-disposition: attachment; filename=invoice.tiff");
header("Content-type: image/tiff");
fpassthru($f);

您还应该添加内容长度标头,如下所示:

//未测试代码header('Content-Length:'.strlen(stream_get_contents($imgPath)));