使用阿里云OSS的预签名url上传文件,报错403

1. 服务端生成预签名上传url

2. 前端使用签名url上传url

问题: 老是报错403

排查过程:

  1. 问了阿里云客户,然并卵!浪费时间!发一堆文档给我看!我要看了解决,早就看了解决了!
  2. 看是否配置了跨域设置。我自己是配置了的,还是报错403。
  3. 于是我用python代码requests尝试,竟然可以成功!
  4. 但是前端vue的同事调用一直403报错!
  5. 经过对比2个的区别,python代码里没有设置Content-Type,在Postman里试了下,果断如此。

反思:

        1. 服务端使用阿里的SDK签名时,并没有对headers签名。所以上传时也不要有!

        2. 要么使用阿里的SDK签名时对headers签名,上传时也带对应headers。

        3. 要保持一致性!

### 解决阿里云OSS强制下载文件时出现的CORS跨域资源共享配置干扰问题 当尝试从浏览器前端直接触发对阿里云对象存储服务(OSS)上的文件进行强制下载操作时,可能会遭遇由浏览器实施的安全机制——即同源政策所引发的跨域资源共享 (CORS) 错误。具体表现为请求被阻止,因为响应头中缺少 `Access-Control-Allow-Origin` 字段[^3]。 为了使来自特定域名下的网页能够合法地发起针对 OSS 上资源的 HTTP 请求并实现文件的强制下载功能,需按照如下方式调整 OSS 的 CORS 设置: #### 配置OSS桶的CORS规则 进入阿里云控制台,在目标 Bucket 的权限管理选项卡下找到“跨域设置”,添加一条或多条新的 CORS 规则以适应实际应用场景的需求。每条规则应至少包含以下几个部分的信息: - **AllowedOrigins**: 定义哪些来源可以访问该资源。如果希望允许所有站点,则可填入通配符 "*";对于更严格的安全需求而言,建议指定确切的 URL 列表。 - **AllowedMethods**: 明确指出客户端能使用的HTTP方法列表,比如 GET、POST 或者 PUT 等。在此场景下通常只需开放GET 方法即可满足文件读取/下载的要求。 - **AllowedHeaders**: 如果涉及到自定义头部字段传递的情况,这里就需要声明相应的名称。不过就单纯的文件下载来说,默认情况下可能并不需要特别设定此参数。 - **ExposeHeaders**: 此项用于指示服务器应当暴露给外部调用者的额外响应头信息。同样地,在简单的文件下载流程里往往也不必过多关注这部分内容。 完成上述配置之后保存更改,此时再执行相同类型的 AJAX 请求就不应该再收到类似的 CORS 报错了。值得注意的是,由于某些缓存机制的存在,修改后的效果或许不会立刻显现出来,等待一段时间后再测试会更为稳妥一些。 另外一种解决方案是在构建下载链接的时候附加签名(Signature),这样即使不依赖于复杂的 CORS 设定也能够在一定程度上规避掉潜在的问题。利用 SDK 提供的功能生成带有有效期限以及必要授权凭证的一次性URL,用户点击后可以直接跳转至对应的文件位置从而启动下载过程[^1]。 ```javascript // 使用阿里云官方提供的 JavaScript SDK 创建带签名直传链接的例子 const client = new OssClient({ region: '<YourRegion>', accessKeyId: '<YourAccessKeyId>', accessKeySecret: '<YourAccessKeySecret>' }); async function getSignedUrl(objectName){ try { const result = await client.signatureUrl(objectName); console.log(`Generated signed url:${result}`); return result; } catch (error) { console.error('Failed to generate signed url:', error.message); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值