Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.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
Angular 发布到AWS S3预签名url时出现SignatureDesNotMatch错误_Angular_Amazon Web Services_Amazon S3_Kotlin_Pre Signed Url - Fatal编程技术网

Angular 发布到AWS S3预签名url时出现SignatureDesNotMatch错误

Angular 发布到AWS S3预签名url时出现SignatureDesNotMatch错误,angular,amazon-web-services,amazon-s3,kotlin,pre-signed-url,Angular,Amazon Web Services,Amazon S3,Kotlin,Pre Signed Url,真的很挣扎,所以任何帮助都将是伟大的 因此,我试图使用预先签名的URL直接从浏览器上传pdf文件到AmazonS3 我使用AWS Java SDK(用Kotlin编写的代码)在服务器上生成url,如下所示: val objectKey = StringBuilder().append("xxx").append("/").append("file1.pdf").toString() val expiration = java.util.Date() var msec =

真的很挣扎,所以任何帮助都将是伟大的

因此,我试图使用预先签名的URL直接从浏览器上传pdf文件到AmazonS3

我使用AWS Java SDK(用Kotlin编写的代码)在服务器上生成url,如下所示:

    val objectKey = StringBuilder().append("xxx").append("/").append("file1.pdf").toString()

    val expiration = java.util.Date()
    var msec = expiration.time
    msec += (1000 * 60).toLong() // Add 1 minute. This means that the url expires in 1 minute.
    expiration.time = msec

    String bucketName = "test"

    val responseHeaders = ResponseHeaderOverrides().withContentType("multipart/form-data")

    val generatePresignedUrlRequest = GeneratePresignedUrlRequest(bucketName, objectKey)
    generatePresignedUrlRequest.method = HttpMethod.POST
    generatePresignedUrlRequest.responseHeaders = responseHeaders
    generatePresignedUrlRequest.expiration = expiration

    return s3Client.generatePresignedUrl(generatePresignedUrlRequest)
然后,此url将返回到使用Angular的浏览器代码。 然后,我使用以下typescript代码直接上传文件:

returnPresignUrl() {
   return this.http.get(this.attachmentUploadUrl, this.httpOptions);
}

但我得到以下错误响应:

<Code>SignatureDoesNotMatch</Code>
<Message>
    The request signature we calculated does not match the signature you 
provided. Check your key and signing method.
</Message>
有什么想法吗

我在预签名url中指定内容类型标头,然后在url的post请求中设置它,因此我看不到标头不匹配的原因(这一错误似乎导致了我看到的问题)

post请求有什么特别之处吗? 将pdf文件上载到S3的内容类型正确吗

任何洞察都会很棒,谢谢

使用:
generatePressignedUrlRequest.setContentType(“应用程序/八位字节流”)

而不是:
多部分/表单数据

下面是生成预签名URL的方法:

public GeneratePresignedUrlRequest getGeneratePresignedUrlRequest(String tempBucketName,String objectKey){
    Date expirationTime = getExpirationTime();
    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(tempBucketName, objectKey);
    generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
    generatePresignedUrlRequest.setExpiration(expirationTime);
    generatePresignedUrlRequest.setContentType("application/octet-stream");
    return generatePresignedUrlRequest;
}

当您拨打电话上传文件时,您应该使用相同的内容类型。

您可以检查您的访问密钥和密钥吗?当您的密钥无效时,也会出现此错误。Java SDK指示您应该使用setMethod(HttpMethod方法),支持的方法有get、PUT、DELETE和HEAD。使用PUT。另外,通常您应该使用setter方法,如setResponseHeaders()。当我将其更改为PUT时,会出现拒绝访问错误。有什么想法吗?access key和secret key不应该包含在其中,因为使用预签名URL的全部目的是我们不需要在浏览器中创建和存储安全凭据。此外,这是Kotlin代码,请记住,直接引用字段并将其设置为与调用set()methodOK相同,因此现在您将获得AccessDenied,你已经克服了最初的问题。您的预签名URL是否过期?客户端时间是否同步?
public GeneratePresignedUrlRequest getGeneratePresignedUrlRequest(String tempBucketName,String objectKey){
    Date expirationTime = getExpirationTime();
    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(tempBucketName, objectKey);
    generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
    generatePresignedUrlRequest.setExpiration(expirationTime);
    generatePresignedUrlRequest.setContentType("application/octet-stream");
    return generatePresignedUrlRequest;
}