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

标签 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 中的文件名?

谢谢

最佳答案

经过一番尝试和错误后,我决定使用 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));

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

关于php - S3 URL 中带双引号的文件名会导致参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097417/

相关文章:

mysql - where in 子句 mysql 按相关性排序

java - 处理包含无效 XML 的 REST 服务响应

xml - 仅为 XSL 1.0 中的特定条件列出组内属性的唯一值

php - 在 Oracle 中始终获得 2 位小数的最佳方法是什么?

php - 求关联数组中相同键值的平均值

javascript - 通过 JQuery ajax 执行 PHP 函数

android - 在 Android XML 中的两个 TextView 之间添加一个行分隔符

php - 在 php 中放置 session 检查后无法显示表格

php从mysql中删除行

MySQL JSON - 选择何处