我正在创建一个指向存储在 AWS / S3 上的项目的下载链接。
在构建此链接时,我已确认数据以 UTF-8 编码,但当用户下载它时,只要链接包含 ASCII 编码以外的任何内容,他们就会遇到此错误。
<Error>
<Code>InvalidArgument</Code>
<Message>Header value cannot be represented using ISO-8859-1.</Message>
<ArgumentName>response-content-disposition</ArgumentName>
<ArgumentValue>attachment;filename="今日も僕は 用もないのに.mp3"</ArgumentValue>
<RequestId>12345</RequestId>
<HostId>12345</HostId>
</Error>
//first attempt - whatever encoding it IS, convert it to utf-8
$encoded_file = mb_convert_encoding($original_filename, "UTF-8", mb_detect_encoding($original_filename));
//second attempt - force filename to use html entities
$encoded_file = mb_convert_encoding($original_filename,'HTML-ENTITIES','UTF-8');
$obj_data['ResponseContentDisposition'] = 'attachment;filename="' . $encoded_file . '"';
$cmd = $s3->getCommand('GetObject', $obj_data);
$presign_url_request = $s3->createPresignedRequest($cmd, AWS_PRESIGNED_URL_EXPIRATION);
强制
attachment;filename
使用 htmlentities 是可行的 - 但它真的很难看。 如果我将文件名转换为 UTF-8,为什么我会从 AWS 收到此错误,标头值无法使用 ISO-8859-1?
不幸的是,HTTP 消息标头没有与 HTTP 消息正文相同的限制。
消息正文支持 UTF-8,但标头不支持(由于历史和技术原因)。 PHP
urlencode
函数对于 header 值得一试,但不确定它会改善情况。
HTTP 标头值中允许的字符 https://stackoverflow.com/a/75998796/8199678