2016-03-19 9 views
0

AWS php sdkを使用してURL文字列を取得すると、ファイル名に二重引用符が含まれているとXMLエラーが発生します。 S3に格納されている実際のファイル名には二重引用符は含まれません。しかし、エンドユーザーは、ファイル(この場合はPDF)をユーザーフレンドリーな名前でダウンロードできるようにしたかったのです。この場合S3 URLに二重引用符を含むファイル名が無効な引数につながる

、ファイル名は次のとおりです。二重引用符は、長さインジケータ(インチ、US)として使用されていることを

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バケットで

3" PVC Lines.pdf 

、それは何か

47258252485.pdf 

のように私が取得XMLエラーは次のとおりです。

エンドユーザーに有益ではありません

3- PVC Lines.pdf 

:二重引用符の前にスラッシュを追加しようとするは

<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> 

このファイル名を生成します。

したがって、質問では、引数ResponseContentDispositionのファイル名として二重引用符を使用することはできますか?いくつかの試行錯誤の後

おかげ

+0

ファイル名に '' 'を入れるのは悪い考えですが、RFC-2183で始まって後方に働くと正しい解決策がバックスラッシュでエスケープされるように見えます...' filename = "3 \" PVC Lines.pdf "。 –

+0

@ Michael-sqlbot - 二重引用符を追加するのは良い考えではないということは間違いありません。実際、Windowsでは、エクスプローラで名前を変更しようとすると直接追加できません。しかし、2つの一重引用符を追加すると効果があります。あなたの 'filename =" 3 \ "PVC'の解決策に関しては、ファイルをダウンロードするときにダッシュが追加されますが、このシナリオでは役立ちません。 –

+0

おそらく私の提案が実際に働くのでダッシュが起こっています。そして、引用符はファイル名では有効ではないのでブラウザによって削除されます。あなたのダブルクォートハックは視覚的には説得力がありますが間違っていてユーザに問題を引き起こす可能性があります。「インチ」や略語「3インチPVC」や「3インチPVC」という言葉を使うと、より良い解決策。 –

答えて

0

は、私は2つの単一引用符を二重引用符をオンにするstr_replaceを使用することにしました。だから、この:

3" PVC 

この化し:

3'' PVC 

を適切なファイル名を指定してファイルをダウンロードするにはS3のAPIを使用している場合のみ。ここでは、2つの単一引用符が間隔を空けて見えます。しかし、ファイルをダウンロードすると二重引用符のように見えるので、エンドユーザはまだそれがインチ表現だと思います。

これは非常に特殊なケースのように見えるかもしれませんが、ファイル名に二重引用符でS3 APIを使用しようとしている他の人に役立つかもしれません。

私のソリューション(誰かが良い答えを返信しない限り):

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

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

編集:上記溶液の交換のいずれもが、誰かがいくつかの注入問題(があるかもしれないと思っただけの場合には、データベースに挿入されませんされていますとにかく、PDOを使用します)。ファイル名はMySQLに安全に挿入されました。元の問題はそれを表示することでした。

関連する問題