强制浏览器使用Javascript window.open下载图像?

时间:2011-04-13 12:12:06

标签: php javascript

有没有办法让图片一旦点击就可以下载(没有右键单击将图像另存为)?

我正在使用一个小的Javascript函数来调用下载页面:

<a href="#" 
   onclick="window.open('download.php?file=test.jpg', 'download', 'status=0');"
>Click to download</a>

在download.php页面中,我有类似的内容:

$file = $_GET['file'];
header('Content-Description: File Transfer');
header("Content-type: image/jpg");
header("Content-disposition: attachment; filename= ".$file."");
readfile($file);

但它不起作用。我做错了什么?
提前谢谢!

11 个答案:

答案 0 :(得分:23)

使用application/octet-stream代替 image / jpg

  

如果在具有application / octet-stream内容类型的响应中使用[Content-Disposition]标头,则隐含的建议是用户代理不应显示响应,而是直接输入`save response as。 ..'对话。
   - RFC 2616 – 19.5.1 Content-Disposition

答案 1 :(得分:19)

我想你忘了在标题上添加Path

if(isset($_GET['file'])){
    //Please give the Path like this
    $file = 'images/'.$_GET['file'];

    if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
    }
}

答案 2 :(得分:7)

或者您可以将.htaccess文件用于所有图像文件。如果您想强制浏览器下载所有图像(例如,从表格列表中):

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^download$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .(jpe?g|gif|png)$ index.php?file=noFoundFilePage [L,NC]
RewriteCond %{QUERY_STRING} ^download$
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .(jpe?g|gif|png)$ - [L,NC,T=application/octet-stream] 

这会查找试图强制将其下载到浏览器中的图像文件。 -f RewriteConds还检查文件是否存在..最后一条规则确保下载仅用于某些文件类型。

答案 3 :(得分:4)

这对我有用

header("Pragma: public");
header('Content-disposition: attachment; filename='.$title);
header("Content-type: ".mime_content_type($sample_file));
header('Content-Transfer-Encoding: binary');
ob_clean(); 
flush(); 
readfile($sample_file);

我还在.htaccess

中添加了以下内容
SetEnvIf Request_URI "\.jpg$" requested_jpg=jpg
Header add Content-Disposition "attachment" env=requested_jpg

不确定这有帮助吗?

答案 4 :(得分:2)

如果您使用的是Apache服务器,这非常简单。

  1. 在文件所在的目录中创建名为.htaccess的文件。对我来说是assets/.htaccess
  2. 将以下内容添加到文件AddType application/octet-stream .jpg。您可以为所需的每个文件扩展名添加新行。例如。 AddType application/octet-stream .pdf
  3. 保存文件
  4. 清除浏览器缓存
  5. 刷新浏览器并享受!

答案 5 :(得分:1)

添加Content-Disposition: attachment标题后,您应该可以使用普通链接:

<a href="download.php?file=test.jpg">Click to download</a>

您尝试过哪些浏览器?

答案 6 :(得分:1)

这是一个按钮,您可以在Internet Explorer中单击以下载图片

<html>
<head>
<title>Your title</title>
</head>
<body>
<form><input type="button" value="Click Me" onClick="window.location.href='image.jpg'"></form>
</body>
</html>

答案 7 :(得分:0)

浏览器识别jpg URL's并将其交给.htm,所以我认为你不能强迫它在用户端(虽然不是肯定的)。

阅读本文

http://apptools.com/phptools/force-download.php

答案 8 :(得分:0)

尝试改变这一点:

header("Content-disposition: attachment; filename= ".$file."");

要:

header("Content-disposition: attachment; filename= ".$file);

如果以上内容对你不起作用,这里有一个强制文件可下载的功能:

    <?php
function downloadFile($file, $type)
{
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$file");
header("Content-Type: Content-type: $type");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($file));
readfile($file);
}

    downloadFile("sd.jpg", "image/jpg");
    ?>

答案 9 :(得分:0)

看看这是否有帮助:

Webkit and Excel file(PHPexcel)

答案 10 :(得分:0)

这是一种强制提示下载某个目录中的所有文件的方法。

<强>要求

  1. 的Apache
  2. mod_headers已启用
  3. 在.htaccess或Apache配置中输入以下内容。

    <Directory /path/to/downloadable/files>
        Header set Content-Disposition attachment
        Header set Content-Type application/octet-stream
    </Directory>