php如何服务文件,但不下载


php how to serve file but NOT for download

下面的代码强制浏览器触发保存/打开文件(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.";
}

最终取决于客户端如何处理它接收到的内容。你可以做的一件事是去掉Content-disposition标题:

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

(或者至少有条件地删除它,这取决于文件的具体因素。)这个头的作用是告诉客户端返回的内容是一个"文件"(您甚至可以为该文件提供一个建议的名称),并且应该这样对待。HTTP本身没有"文件"的概念,所以这个头文件的存在是专门为了将某些东西标识为"文件"。"

如果不提供该头文件,则不会向客户端暗示该内容是一个文件。客户端可能仍然推断出是一个文件,并将其视为文件(这是您无法控制的),但是从您的端来看,您所做的就是返回内容本身。

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

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
}

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

例如,如果type是image,那么

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

等。

,如果是图像或pdf,则删除Content-Disposition: header