不使用S3内容的Cloudfront签名URL使用.NET SDK处理带有空格的文件名

时间:2015-03-17 18:42:02

标签: c# .net amazon-web-services amazon-s3 amazon-cloudfront

我已正确设置具有S3源的Cloudfront签名URL,并使用response-content-disposition查询字符串参数指定文件下载名称。当内容处理文件名不包含空格时,我使用.NET AWS SDK AmazonCloudFrontUrlSigner.GetCannedSignedURL方法生成的签名URL正常工作。但是,如果文件名包含空格,我将被拒绝访问。因此,类似下面的代码会生成一个允许拒绝访问的URL。

var contentDisposition = HttpUtility.UrlEncode("attachment;filename=My File.txt");
var key = "example.txt?response-content-disposition="+contentDisposition;
return AmazonCloudFrontUrlSigner.GetCannedSignedURL(
    AmazonCloudFrontUrlSigner.Protocol.https,
    "myBucket",
    cloudFrontPrivateKey,
    key, cloudFrontAccessKeyId, expirationDateTime);

它似乎与URL编码有关。

我已阅读有关Serving Private Content through CloudFront的文档中的所有信息。我读了code of the AmazonCloudFrontUrlSigner class。我还尝试了许多UrlEncode的组合,比如不编码,只编码文件名部分甚至不编码,但在生成签名URL后用编码版本替换。所有这些都提供拒绝访问或签名与网址不匹配的错误。

1 个答案:

答案 0 :(得分:4)

HttpUtility.UrlEncode方法将空格编码为+,根据标准可以接受。但是,由于某些原因我不明白,这会导致签名URL和内容处置出现问题。空格的另一个编码%20正常工作。因此,在编码后,将+替换为%20。工作版本是:

var contentDisposition = HttpUtility.UrlEncode("attachment;filename=My File.txt");
contentDisposition = contentDisposition.Replace("+", "%20");
var key = "example.txt?response-content-disposition="+contentDisposition;
return AmazonCloudFrontUrlSigner.GetCannedSignedURL(
    AmazonCloudFrontUrlSigner.Protocol.https,
    "myBucket",
    cloudFrontPrivateKey,
    key, cloudFrontAccessKeyId, expirationDateTime);