S3 URL中带双引号的文件名会导致无效参数

时间:2016-03-19 03:19:17

标签: php mysql xml amazon-s3

使用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中允许双引号用作文件名?

由于

1 个答案:

答案 0 :(得分:0)

经过一些试验和错误后,我决定使用str_replace将双引号转换为两个单引号。所以这个:

3" PVC

变成了这个:

3'' PVC

仅在使用S3 API下载具有适当文件名的文件时。在这里,两个单引号看起来间隔开。但是当你下载一个文件时,它看起来就像一个双引号,所以最终用户认为它仍然是一英寸的代表。

这似乎是一个非常具体的案例,但它可能会帮助其他尝试在文件名中使用双引号的S3 API。

我的解决方案(除非有人回答更好的答案):

$badChars  = array('&ndash;','&rdquo;','&ldquo;','"','&quot;');
$goodChars = array('-','\'\'','\'\'','\'\'','\'\'');

$data      = trim(str_replace($badChars,$goodChars, $data));

编辑:上述解决方案替换都没有被插入到数据库中,以防万一有人认为可能存在一些注入问题(当然,使用PDO)。文件名已安全地插入MySQL。最初的问题是关于显示它。