我有一个没有扩展名的文件,但我知道这是一个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),则可以正常工作。
如何在不重命名文件的情况下完成此操作以包含扩展程序?
答案 0 :(得分:1)
您正在从URL检索文件,因此在readfile
中激活'fopen wrappers'。一般情况下,你不应该这样做,特别是在本地工作时,因为它会调用很多不必要的开销,并且(在这种情况下)会产生不必要的“魔法”行为。
只需在文件的本地路径上使用readfile
,就可以了,或使用die(file_get_contents($imgPath))
代替最后一行来规避PHP的本机行为。
答案 1 :(得分:1)
'tiff'扩展名可能在服务器上注册为已知文件类型,因此当您重命名并请求tiff时,它的权限将允许您打开它。但是,如果没有扩展,安全性可能会阻止您阅读它,如上面的'Mike B'所述。要检查这一点,请尝试在浏览器地址栏中输入文件名,看看是否打开,包括和不包含'tiff'扩展名。没有解决方法可以解决安全问题,而不是更改服务器安全性,这将是非常糟糕的。
答案 2 :(得分:0)
它对我有用:
$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);
答案 3 :(得分:0)
您还应该像这样添加内容长度标题:
//未经测试的代码 header('Content-Length:'。threadl(stream_get_contents($ imgPath)));