阿里云OSS-使用签名URL上传,避免403异常 ERR_BAD_REQUEST

重点:headers要保持一致!如果生成签名URL时设置了header参数,例如用户元数据,存储类型等,则调用签名URL上传文件时,也需要将这些参数发送至服务端。如果签名和发送至服务端的不一致,会报签名错误。

错误信息

<Error>

<Code>SignatureDoesNotMatch</Code>

<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

<EC>0002-00000040</EC>

<RecommendDoc>https://api.aliyun.com/troubleshoot?q=0002-00000040</RecommendDoc>

</Error>

 Java服务端生成签名URL

public String uploadId(String path) {
    InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(properties.getBucket(), path);
    InitiateMultipartUploadResult result = client.initiateMultipartUpload(request);
    return result.getUploadId();
}

public String generatePartUploadPreSignUrl(String filename, String partNumber, String uploadId) {
    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(properties.getBucket(), filename, HttpMethod.PUT);
    request.setMethod(HttpMethod.PUT);
    // 一个小时有效期
    Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
    request.setExpiration(expiration);
    // 分块索引
    request.addQueryParameter("partNumber", partNumber);
    request.addQueryParameter("uploadId", uploadId);
 // 如果生成签名URL时设置了header参数,例如用户元数据,存储类型等,则调用签名URL上传文件时,也需要将这些参数发送至服务端。如果签名和发送至服务端的不一致,会报签名错误。
    Map<String, String> headers = new HashMap<>();
    headers.put(OSSHeaders.CONTENT_TYPE, "multipart/form-data");
    request.setHeaders(headers);
    return client.generatePresignedUrl(request).toString();
}

前端使用签名URL上传

// 获取上传alioss的签名
aliossPreSignUrl(this.uploadId, this.filename, this.chunkIndex)
  .then((res: any) => {
    // 拿到签名之后将分块内容上传到alioss
    return this.client.put(res.data.url, tmpFile, {
 // 如果生成签名URL时设置了header参数,例如用户元数据,存储类型等,则调用签名URL上传文件时,也需要将这些参数发送至服务端。如果签名和发送至服务端的不一致,会报签名错误。
      headers: {
        "Content-Type": "multipart/form-data",
      },
    });
  })
  .then(() => {
    this.chunkIndex += 1;
    this.start();
  })
  .catch((e: any) => {
    this.uploadedFail(e);
  });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arvin627

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值