2012-02-14 28 views
1

我一直在寻找一个前端JS解决方案来解决这个问题/在浏览器中强制下载文件的概念。基本上,我想让浏览器通过js事件下载文件。我知道在HTML5中我们有下载属性,但它只在Chrome中受到支持,最终用户仍然需要实际点击链接,我无法触发它。但缺乏浏览器支持对我的需求来说更成问题。强迫文件下载与PHP头影响我的带宽?

所以,我以为我会使用PHP和“内容处置:附件”这是伟大的工作,但现在它的服务器端的代码,我不知道是否会影响我的带宽。下载的文件是外部文件,并不在我的服务器上。

此外,虽然“download.php?file = http://domain.com/image.jpg”为我下载文件,我无法弄清楚如何通过ajax请求下载以“下载.php?file = http://domain.com/image.jpg“

任何想法?

这里是PHP代码的一部分:

header("Content-Disposition: attachment; filename=\"".basename($filename)."\";"); 
header("Content-Transfer-Encoding: binary"); 
readfile("$filename"); 

好,以及启动对前端下载一个办法是应用X-框架,选项报头的download.php然后在iframe中打开图像,作为内容添加到的download.php:

header('X-Frame-Options: DENY'); 

然后做到这一点用JS/jQuery的:

$("body").append(<iframe src="download.php?file=http://domain.com/image.jpg"></iframe>); 

但是我仍然在使用download.php并且会得到一个带宽成本,所以它并不理想。任何其他想法?我只想在页面上显示一堆图像,并允许用户单击一个按钮将它们全部下载。图片不是由我托管的,我不想带宽受到影响。

在下载HTML5属性而言,不能够触发它,jQuery的点击或触发点击失败,但是这个代码确实让我来触发程序下载:

var clickEvent = document.createEvent("MouseEvent"); 
clickEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
$("a")[0].dispatchEvent(clickEvent); 

但是,这个下载属性只在Chrome中支持,所以我越来越近,但还没有。任何人?

+0

你能显示一些代码吗?你的问题到底是什么 - 我不太了解Ajax如何进入这里 – 2012-02-14 17:32:16

+0

Ajax无法做文件下载 - 这是一个后台操作。您需要使用'window.location ='download.php .....“来强制执行前台操作。 – 2012-02-14 17:40:42

+0

我下载的php文件效果很好,你去它下载一个在查询中指定的文件,当我去download.php?file = http://domain.com/image.jpg - 它下载http:// domain.com/image.jpg,但我正尝试下载多个文件,因此我想为每个文件的download.php调用(ajax调用)。我可以让ajax调用返回图像,但不能下载它。 – iwek 2012-02-14 17:42:59

回答

0

如果我去一个网页,它启动文件的自动下载,我点击取消,并尝试关闭浏览器了。我怀疑很多其他人会对浏览器的制造商有相同的看法和希望。如果我收到提示“我想要下载此文件”,我希望它。

要回答你的问题,如果文件被从服务器B下载那么这将是对服务器B上的带宽会受到影响。

+0

这是我的主要问题,该文件是从服务器B下载的,它肯定有带宽成本,但是我的服务器呢?如果这是所有的JS我会确定我的服务器没有使用带宽,但因为我有PHP代码来获取文件,我不知道它是否有所作为。 – iwek 2012-02-14 17:46:12

+0

在我目前的工作场所,我们在CDN上有我们的JavaScript文件。有人访问我们的网页之一是从我们的网络服务器那里获得的页面,但是指向JavaScript的链接指向了CDN服务器。因此,Web服务器的带宽不受影响。我重新阅读了你的文章和其他人的评论,在我看来,你的代码将文件从服务器B拉到服务器,然后再将这些文件推出。所以,这会影响两台服务器的带宽。 – 2012-02-15 09:24:15

+0

感谢丹尼尔,你是对的,这就是为什么我想弄清楚一个完整的前端解决方案。不幸的是,只有Chrome支持HTML5下载属性才能完成此操作。 – iwek 2012-02-15 15:57:31

1

看起来你正在使用PHP来获取远程文件,然后请求的Web浏览器会从你的PHP服务器下载。是的,它将影响带宽,因为必须将原始源的全部内容复制到服务器,并将复制的内容发送到浏览器。

从本质上讲,你有可能被人们发送请求被滥用于大文件用尽你的数据传输限制,如果你不过滤链接到下载请求的基本代理。

另外,我不明白你为什么会想从一个AJAX请求开始下载,即使它是可能的。要下载的文件不应该影响加载的页面。

+0

谢谢,是的,这是有道理的。我上面发布了我的PHP代码,我希望事实并非如此。 – iwek 2012-02-14 17:48:53