我正在从服务器下载文件到本地计算机,如下所示:
$file = ( "TestFile.txt" );
header( "Content-Type: application/octet-stream" );
header( "Accept-Ranges: bytes" );
header( "Content-Length: " . filesize( $file ) );
header( "Content-Disposition: attachment; filename=testfile.txt" );
readfile( $file );
它正在工作,但它总是将文件保存在下载文件夹中,而不询问位置。我想打开窗口,就像在OpenOffice/MS Word中保存任何文档一样,选择文件系统上的任何位置并创建新文件夹选项。当我们在浏览器窗口中另存为时,我想要的窗口也会出现。
希望你能理解我的问题。有可能在所有浏览器/OS中都能做到这一点吗。
感谢
Content Disposition的规范规定接收用户代理应忽略filename参数值中的任何路径组件:
接收[用户代理]不应尊重文件名参数中可能存在的任何目录路径信息。文件名应仅作为终端组件处理。
原因是它引发了一个安全漏洞:
由于该备忘录为发送者提供了建议文件名的方式,接收[用户代理]必须注意发件人建议的文件名不代表危险。以UNIX为例,一些危险将是:
- 创建启动文件(例如"
.login
")- 创建或重写系统文件(例如"
/etc/passwd
")- 覆盖任何现有文件
- 将可执行文件放入任何命令搜索路径(例如"
~/bin/more
")- 将文件发送到管道(例如"
| sh
")
没有你提议的那样的东西。如何处理HTTP响应,尤其是如何处理不可显示的内容(如octet-stream
),取决于客户端(即web浏览器)。大多数浏览器都会提供下载选项,但不需要任何特定的形式。这样传递建议的文件名大约与当前浏览器所解释的一样多。
当然,总有一个定制的浏览器可以接受额外的头部信息,但目前还没有广泛的浏览器这样做。请记住,一般来说,我们不想将任何关于客户端环境的信息暴露在互联网上,所以即使建议下载路径也可能被视为违反了这一点。想象一下,我建议/etc/passwd
作为所需的位置。
如果你真的喜欢窥探访问者的硬盘,可以使用ActiveX或Java小程序:-)
不是直接通过头,但您可以使用java小程序或可能的flash来完成这项工作。
http://www.javaatwork.com/java-download-applet/details.html