相关疑难解决方法(0)

当我设置包含"+"的响应标头覆盖时,为什么我的S3预签名请求无效?

我正在使用Amazon .NET SDK生成预先签名的URL,如下所示:

public System.Web.Mvc.ActionResult AsActionResult(string contentType, string contentDisposition)
{
    ResponseHeaderOverrides headerOverrides = new ResponseHeaderOverrides();
    headerOverrides.ContentType = contentType;
    if (!string.IsNullOrWhiteSpace(contentDisposition))
    {
        headerOverrides.ContentDisposition = contentDisposition;
    }

    GetPreSignedUrlRequest request = new GetPreSignedUrlRequest()
               .WithBucketName(bucketName)
               .WithKey(objectKey)
               .WithProtocol(Protocol.HTTPS)
               .WithExpires(DateTime.Now.AddMinutes(6))
               .WithResponseHeaderOverrides(headerOverrides);

    string url = S3Client.GetPreSignedURL(request);

    return new RedirectResult(url, permanent: false);
}
Run Code Online (Sandbox Code Playgroud)

这非常有效,除非我的中contentType包含一个+.当我尝试获取SVG文件(例如,获取内容类型)时会发生这种情况image/svg+xml.在这种情况下,S3会抛出SignatureDoesNotMatch错误.

错误消息显示StringToSign如下:

GET 1234567890 /blah/blabh/blah.svg?response-content-disposition=filename="blah.svg"&response-content-type=image/svg xml
Run Code Online (Sandbox Code Playgroud)

请注意,response-content-type中有一个空格,现在它image/svg xml代替的是image/svg+xml.在我看来,这就是导致问题的原因,但是解决这个问题的正确方法是什么?

我应该编码我的内容类型吗?用引号或其他东西括起来?文档没有说明这一点.

c# amazon-s3

6
推荐指数
1
解决办法
3493
查看次数

Amazon S3 Presigned URL从密钥中删除斜杠

我使用Java Amazon SDK与S3一起存储上传的文件.我想保留原始文件名,我把它放在密钥的末尾,但我也使用虚拟目录结构 - 类似于<dirname>/<uuid>/<originalFilename>.

问题是,当我想使用api生成预先下载的URL以供下载时:

URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
return url.toExternalForm();
Run Code Online (Sandbox Code Playgroud)

sdk url转义整个键,包括斜杠.虽然它仍然有效,但这意味着下载文件的名称包括整个密钥,而不仅仅是最后的原始文件名位.我知道应该可以在不转义斜杠的情况下执行此操作,但我正在尝试避免重写SDK中已有的大量代码.这有一个共同的解决方案吗?我知道我使用了遵循相同模式的Web应用程序,并且没有斜杠转义问题.

java urlencode amazon-s3

5
推荐指数
2
解决办法
3421
查看次数

标签 统计

amazon-s3 ×2

c# ×1

java ×1

urlencode ×1