使用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中允许双引号用作文件名?
由于
答案 0 :(得分:0)
经过一些试验和错误后,我决定使用str_replace将双引号转换为两个单引号。所以这个:
3" PVC
变成了这个:
3'' PVC
仅在使用S3 API下载具有适当文件名的文件时。在这里,两个单引号看起来间隔开。但是当你下载一个文件时,它看起来就像一个双引号,所以最终用户认为它仍然是一英寸的代表。
这似乎是一个非常具体的案例,但它可能会帮助其他尝试在文件名中使用双引号的S3 API。
我的解决方案(除非有人回答更好的答案):
$badChars = array('–','”','“','"','"');
$goodChars = array('-','\'\'','\'\'','\'\'','\'\'');
$data = trim(str_replace($badChars,$goodChars, $data));
编辑:上述解决方案替换都没有被插入到数据库中,以防万一有人认为可能存在一些注入问题(当然,使用PDO)。文件名已安全地插入MySQL。最初的问题是关于显示它。