[英]PHP Content-Disposition header: Specialcharacters in the filename
我正在尝试下载文件名中包含特殊字符的 php 文件。 不幸的是,这些字符被“_”代替了。
代码:
$filename = trim('<>$%&/=?' . '.txt');
header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
header("Cache-Control: public");
header("Content-Type: application/text");
header("Content-Transfer-Encoding: Binary");
header('Content-Disposition: attachment; '
. sprintf('filename="%s"; ', urlencode($filename))
. sprintf("filename*=utf-8''%s", urlencode($filename)));
echo "file contents";
die();
返回一个名为
"__$%&_=_.txt"
我尝试了 urlencode()、rawurlencode()、mb_convert_string($filename, "UTF-8") 的不同变体。 已经存在的问题Special Characters in Content-Disposition filename , 如何将Content-Disposition header的filename参数编码为HTTP? 和PHP:RFC-2231 如何将 UTF-8 字符串编码为 Content-Disposition 文件名并没有真正帮助我。 你有什么进一步的想法吗?
该文件的编码为 UTF-8。
Sprintf() 似乎不是问题所在:
header("Content-Disposition: attachment; filename*=utf-8''" . rawurlencode($filename));
或者
header("Content-Disposition: attachment; filename=\"" . $filename . "\"");
给出相同的结果。
我相信,这个问题与文件名的编码无关( "Content-Disposition: attachment; filename*=utf-8''" . rawurlencode($filename)
选项似乎是正确的)。
一些字符,例如?
, <
, >
只是不允许在特定平台上的文件名中使用,并由浏览器替换为_
。
此外,您可以在Content-Disposition
标头中同时包含filename
和filename*
参数,将前者用作不支持扩展filename*
参数的客户端的后备。 它可以通过content-disposition库无缝完成。
你试过这个吗?
header("Content-Disposition: attachment; filename=".utf8_decode(htmlspecialchars_decode($filename)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.