使用jQuery下载文件

Download File Using jQuery

如何在用户单击链接时提示下载。

例如,而不是:

1
Download Here

我可以用:

1
2
3
Download Here

 $('a').click... //Some jquery to download the file

这样,Google就不会将我的HREF和私人文件编入索引。

这可以用jQuery完成,如果是这样,怎么样? 或者应该用PHP或其他东西来完成?


我可能会建议使用preventDefault作为更优雅的降级解决方案:

1
2
3
4
5
6
$('a').click(function(e) {
    e.preventDefault();  //stop the browser from following
    window.location.href = 'uploads/file.doc';
});

Download now!

即使没有Javascript,至少这种方式用户也会得到一些反馈。


如果您不希望搜索引擎为某些文件编制索引,您可以使用robots.txt告诉网络蜘蛛不要访问您网站的某些部分。

如果您只依赖于javascript,那么一些没有它的用??户将无法点击您的链接。


这是一篇很好的文章,展示了从搜索引擎隐藏文件的许多方法:

http://antezeta.com/news/avoid-search-engine-indexing

JavaScript不是索引页面的好方法;它不会阻止用户直接链接到您的文件(从而将其显示给抓取工具),正如Rob提到的那样,并不适用于所有用户。
一个简单的解决方法是添加rel="nofollow"属性,但是如果没有robots.txt,它就不完整了。

1
Download Here


是的,您必须将window.location.href更改为您要下载的文件的URL。

1
window.location.href = 'http://www.com/path/to/file';

1
2
3
4
 var link=document.createElement('a');
 document.body.appendChild(link);
 link.href=url;
 link.click();


通过声明window.location.href = 'uploads/file.doc';,您可以显示存储文件的位置。您当然可以使用.htacess强制存储文件所需的行为,但这可能并不总是很少....

最好创建一个服务器端的php文件并将其放入其中:

1
2
3
4
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$_REQUEST['f']);
readfile('../some_folder/some_subfolder/'.$_REQUEST['f']);
exit;

此代码将返回任何文件作为下载,而不显示您实际存储它的位置。

你通过window.location.href = 'scripts/this_php_file.php?f=downloaded_file';打开这个php文件


  • 使用jQuery函数

    1
    2
    3
        var valFileDownloadPath = 'http//:'+'your url';

       window.open(valFileDownloadPath , '_blank');

隐藏的iframe可以提供帮助


我建议你使用mousedown事件,它在click事件之前被调用。
这样,浏览器自然地处理click事件,这避免了任何代码怪异:

1
2
3
4
5
6
7
8
9
10
11
12
13
(function ($) {


    // with this solution, the browser handles the download link naturally (tested in chrome and firefox)
    $(document).ready(function () {

        var url = '/private/downloads/myfile123.pdf';
        $("a").on('mousedown', function () {
            $(this).attr("href", url);
        });

    });
})(jQuery);

有关使用jQuery清除表单的类似帖子,请参阅此处:使用jQuery重置多阶段表单

您可能还遇到了struts值堆栈重新填充值的问题。换句话说,您提交表单,在操作类中执行任何操作,但不清除操作类中的相关字段值。在这种情况下,表单似乎会保留您先前提交的值。如果以某种方式持久化这些,只需在持久化之后并在返回SUCCESS之前使动作类中的每个字段值都为空。