Php S3URL中带双引号的文件名导致参数无效
使用AWS php sdk检索URL字符串时,如果文件名中有双引号,则会出现XML错误。存储在S3中的实际文件名不包含双引号。但最终用户希望能够下载具有用户友好名称的文件(在本例中为PDF) 在这种情况下,文件名为:Php S3URL中带双引号的文件名导致参数无效,php,mysql,xml,amazon-s3,Php,Mysql,Xml,Amazon S3,使用AWS php sdk检索URL字符串时,如果文件名中有双引号,则会出现XML错误。存储在S3中的实际文件名不包含双引号。但最终用户希望能够下载具有用户友好名称的文件(在本例中为PDF) 在这种情况下,文件名为: 3" PVC Lines 请注意,双引号用作长度指示器(英寸,美国)。因此,用任何东西替换双引号都不会产生用户友好的名称 以下是我正在使用的代码: $s3CMD = $s3Client->getCommand('GetObject', [ 'Bucket' => $b
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”指定)是:
在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
仅当使用S3API下载具有正确文件名的文件时。在这里,两个单引号看起来是隔开的。但是当你下载一个文件时,它看起来就像一个双引号,所以最终用户认为它仍然是一个英寸的表示
这似乎是一个非常特殊的情况,但它可能会帮助其他试图使用文件名中带双引号的S3API的人
我的解决方案(除非有人给出更好的回答):
编辑:上面的解决方案替换都没有插入到数据库中,以防有人认为可能存在注入问题(当然,无论如何,使用PDO)。该文件名已安全插入MySQL。最初的问题是关于显示它。在文件名中放置一个
“
似乎是个坏主意,但如果您从RFC-2183开始向后工作,正确的解决方案似乎是用反斜杠将其转义…filename=“3\”PVC Lines.pdf”
@Michael sqlbot-你说得对,添加双引号不是个好主意。事实上,Windows不允许我在资源管理器中重命名它时直接添加它。但添加两个单引号是有效的。至于您的解决方案filename=“3\”PVC
,这在下载文件时添加了一个破折号,这在这种情况下没有帮助。可能出现破折号是因为我的建议确实有效——然后浏览器会删除引号,因为它在文件名中无效。你的双单报价黑客是视觉上令人信服的,但肯定是错误的,可能会给你的用户带来问题。。。使用“inch”或缩写--3英寸PVC
或3英寸PVC
可能是更好的解决方案。
3'' PVC
$badChars = array('–','”','“','"','"');
$goodChars = array('-','\'\'','\'\'','\'\'','\'\'');
$data = trim(str_replace($badChars,$goodChars, $data));