当前位置:  开发笔记 > 编程语言 > 正文

安全地在浏览器中下载具有正确文件名的文件

如何解决《安全地在浏览器中下载具有正确文件名的文件》经验,为你挑选了1个好方法。

我正在一个网站上做一些工作,该网站有一个安全区域,只有在用户登录后才能使用.在这个区域有一个页面,其中包含可以下载的pdf文档的链接.物理文档位于Web站点的根目录之外.pdf文档的链接如下所示:

的index.php?页=安全区域/下载&文件= protected.pdf

它执行以下(注:我知道这是强制进行下载,而不是打开该文件的方式的浏览器):

// check security, get filename from request, prefix document download directory and check for file existance then...

header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Connection: Close');
set_time_limit(0);
readfile($file);

这很好用,但在Firefox 3和Internet Explorer 7(我没有使用任何其他浏览器进行测试)不会在浏览器中打开此文件,它们都显示下载对话框(如预期的那样).如果我选择"打开"而不是"保存",则会下载文档并在浏览器外部启动Adobe Reader以呈现文档.

我遇到的问题是在浏览器中下载文件并保存正确的默认文件名.

我想在浏览器中打开该文档.一种方法是使用标题"Content-Disposition:inline;" 但这意味着我无法指定文件名(因为浏览器似乎忽略了).这样做的问题是当我保存文档时,默认名称是URL的名称,而不是pdf文档的文件名:

http___example.com_index.php_page=secure_area_download&file=protected.pdf

如何让Firefox和Internet Explorer在浏览器中打开文档并提供正确的默认文件名来保存?



1> Stacey Richa..:

我终于想出了解决这个问题的方法.

尽管RFC 2183显示文件名参数可以用于Content-Disposition头字段的附件和内联,但是当使用内联时,浏览器似乎忽略了filename参数,而是尝试找出文件名应基于的内容URL.如果URL没有查询字符串,则最后一个/后面的URL部分似乎用作文件名.

我已经更改了下载受保护的PDF文档的链接,以使用不包含查询字符串的漂亮URL,并使用带有.htaccess文件的mod_rewrite来转换这些漂亮的URL,以使用正确的参数执行正确的脚本:

旧链接:

index.php?page=secure-area/download&file=document.pdf

新链接:

file/secure-area/download/document.pdf 

的.htaccess:

RewriteEngine On
RewriteRule ^file/secure-area/download/(.*)$ index.php?page=secure-area/download&file=$1 [L]

用于实际发送文件的脚本与我之前使用的相同(注意问题中的示例使用Content-Disposition:attachment而不是Content-Disposition:inline来演示浏览器在内联时使用正确的文件名保存文档).

// check security, get filename from request, prefix document download directory and check for file existance then...
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="' . basename($file) . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Connection: Close');
set_time_limit(0);
readfile($file);

现在PDF文档在浏览器中打开,保存时默认文件名为

document.pdf

并不是

http___example.com_index.php_page=secure_area_download&file=document.pdf

IE 7在保存文件时将文件名中的空格转换为+和单引号为%27(Firefox没有),我想阻止它发生,但与此同时我对我所拥有的内容感到满意.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有