php如何提供文件,但不能下载

时间:2013-06-05 12:40:49

标签: php

下面的代码强制浏览器触发保存/打开文件(https://kb.wisc.edu/images/group27/13334/open-prompt.PNG)的提示,即使它是图像或pdf文件。

我想像往常一样打开图像,pdf文件要在浏览器中显示。当然,zip,rar,doc,xls等浏览器不支持的其他文件将触发保存文件对话框。

编辑: 我的意图是不阻止客户端保存文件,当然他们可以保存它是不可能的。我希望将图像作为PHP文件发送,如main.php?file = randomcode(存储在数据库中),而不是/images/somefilename.jpg。我的代码强制客户端下载它,但我想显示它。

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . $filename . "." . $fileinfo["file_extension"] . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($file));
$fp = fopen($file, "r");
if ($fp) {
    while (!feof($fp)) {
        $cur_data = fread($fp, 1024);
        echo $cur_data;
    }
} else {
    echo "Error: Could not the read file.";
}

3 个答案:

答案 0 :(得分:0)

好吧,显然你知道文件扩展名,所以你可以这样做:

if(in_array($fileinfo["file_extension"], array('jpg', 'png', 'gif')) {

    // set header for viewing the image

    $mime_type = $fileinfo["file_extension"];
    if($mime_type == 'jpg') {
        $mime_type = 'jpeg';
    }

    header('Content-Type: image/' . $mime_type);

}
else {
    // set headers for downloading the file
}

答案 1 :(得分:0)

最终,由客户决定如何处理收到的内容。你可以做的一件事是摆脱Content-disposition标题:

header("Content-Disposition: attachment; filename=\"" . $filename . "." . $fileinfo["file_extension"] . "\";");

(或至少有条件地删除它,具体取决于有关文件的特定因素。)此标头的作用是告诉客户端返回的内容是“文件”(您甚至提供文件的建议名称) )应该这样对待。 HTTP没有“文件”的本机概念,因此该标头专门用于将某些内容标识为“文件”。

如果不提供该标题,则不建议客户端该内容是文件。客户端可能仍推断它是一个文件并将其视为(您无法控制),但从您的角度来看,您所做的只是返回内容本身。

答案 2 :(得分:-1)

如果内容类型设置为octate流,那么它将无法传输文件意味着用户将强行下载它。你必须相应地设置内容类型才能在浏览器中打开它

例如,如果type是image,那么

header("Content-Type: image/jpg");
header("Content-Type: image/png");

如果它的图像或pdf然后删除Content-Disposition:header