Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php S3URL中带双引号的文件名导致参数无效_Php_Mysql_Xml_Amazon S3 - Fatal编程技术网

Php S3URL中带双引号的文件名导致参数无效

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

使用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”指定)是:

在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('&ndash;','&rdquo;','&ldquo;','"','&quot;');
$goodChars = array('-','\'\'','\'\'','\'\'','\'\'');

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