簡體   English   中英

PHP Content-Disposition header:文件名中的特殊字符

[英]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標頭中同時包含filenamefilename*參數,將前者用作不支持擴展filename*參數的客戶端的后備。 它可以通過content-disposition庫無縫完成。

你試過這個嗎?

header("Content-Disposition: attachment; filename=".utf8_decode(htmlspecialchars_decode($filename))); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM