使用 AWS php sdk 检索 URL 字符串时,如果文件名中包含双引号,我会收到 XML 错误。 S3中存储的实际文件名不包含双引号。但最终用户希望能够下载具有用户友好名称的文件(在本例中为 PDF)。
在本例中,文件名是:
3" PVC Lines
请注意,双引号用作长度指示符(英寸,美国)。因此,用任何内容替换双引号不会产生用户友好的名称。
这是我正在使用的代码:
$s3CMD = $s3Client->getCommand('GetObject', [
'Bucket' => $bucketName,
'Key' => $actualBucketFileName,
'ResponseContentDisposition' => 'filename="' . $systemFileName . '"'
]);
$s3Request = $s3Client->createPresignedRequest($s3CMD, '+20 minutes');
$fileUploadNameURL = (string) $s3Request->getUri();
存储在 MySQL 中的文件名(由上面的“$systemFileName”指定)是:
3" PVC Lines.pdf
在 S3 存储桶中,类似于
47258252485.pdf
我得到的 XML 错误是:
<Error>
<Code>InvalidArgument</Code>
<Message>Header value contained an open quoted span.</Message>
<ArgumentName>response-content-disposition</ArgumentName>
<ArgumentValue>
filename="3" PVC Lines.pdf"
</ArgumentValue>
尝试在双引号前面添加斜杠会产生以下文件名:
3- PVC Lines.pdf
这对最终用户没有帮助。
所以问题是,如何允许双引号用作参数 ResponseContentDisposition 中的文件名?
谢谢
最佳答案
经过一番尝试和错误后,我决定使用 str_replace 将双引号转换为两个单引号。所以这个:
3" PVC
变成了这样:
3'' PVC
仅当使用 S3 API 下载具有正确文件名的文件时。在这里,两个单引号看起来间隔开。但是当您下载文件时,它看起来就像双引号,因此最终用户认为它仍然是英寸表示。
这可能看起来是一个非常具体的案例,但它可能会对尝试使用文件名中包含双引号的 S3 API 的其他人有所帮助。
我的解决方案(除非有人回复更好的答案):
$badChars = array('–','”','“','"','"');
$goodChars = array('-','\'\'','\'\'','\'\'','\'\'');
$data = trim(str_replace($badChars,$goodChars, $data));
编辑:上述解决方案替换都没有插入到数据库中,以防万一有人认为可能存在一些注入(inject)问题(当然,无论如何使用 PDO)。文件名已安全插入 MySQL。最初的问题是关于显示它。
关于php - S3 URL 中带双引号的文件名会导致参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097417/