开发者社区 > 云存储 > 对象存储OSS > 正文

前端跨域请求

问题描述

我们希望在前端中使用put请求直接将图片上传到OSS(即Client直接与OSS通信,不经过Server),但是遇到CORS问题:

前端代码如下:

var formData = new FormData();
formData.append("init_img", $("#initImg")[0].files[0]);
$.ajax({
    url: upload_signurl,
    type: 'put',
    data: formData,
    contentType: false,
    cache: false,
    async: false,
    crossDomain: true, 
    processData: false,
    success: function(result) {
        console.log('upload sucess!')
    },
    error: function(re) {
        console.log('upload failed!')
    }
})

期望结果

由于业务逻辑的问题,我们不希望使用代理。因为:

  1. 代理仍然会产生Client到ProxyServer的数据流,ProxyServer再转发到OSS,而不是直接从Client上传到OSS
  2. 对于前后端未分离的框架,我们很难使用nginx进行代理,只能在后端增加相应接口

已尝试的方法

尝试在sign_url的时候添加头部信息:

headers = dict()
headers['x-oss-ac-forward-allow'] = True
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Credentials'] = True
self.bucket.sign_url(method, key, OSS.expire_time_seconds[method], headers=headers)

但仍然会出现CORS

因为这是PUT方法,也无法使用jsonp的方式

因为这是Flask项目,也很难使用中间代理

是不是需要服务器(OSS)端添加响应头?

展开
收起
游客sh2kgus7rasds 2022-12-10 11:23:45 186 0
2 条回答
写回答
取消 提交回答
  • 问题总能找到解决方案的

    你好,在域名和端口号有一种不相同的情况下就会出现跨域,并且目前不同的浏览器对于跨域的处理方式也有略微差异。

    从您上述的截图来看应该是用的 http://localhost:20000 向oss的域名 80 端口发起的请求,建议您尽量将本地的项目调试时配置为域名 example.com 端口为80的方式进行调试。接着在您的OSS控制台中找到 bkmk 这个bucket,并配置跨域规则,入口如下:

    以网站域名为example.com 为例,OSS的跨域配置如下图:

    • 80或者443端口,将下图的来源改为:*.example.com (推荐这种)
    • 其他端口,将来源改为: *.example.com:{端口号}

    配合官方的sdk上传会方便,如果大文件的上传,建议您使用分片上传:

    2022-12-13 16:29:47
    赞同 展开评论 打赏
  • 请参考文档设置跨域资源共享(CORS)准备工作中“设置跨域资源共享CORS”部分配置跨域规则。

    2022-12-12 13:15:20
    赞同 1 展开评论 打赏

对象存储 OSS 是一款安全、稳定、高性价比、高性能的云存储服务,可以帮助各行业的客户在互联网应用、大数据分析、机器学习、数据归档等各种使用场景存储任意数量的数据,以及进行任意位置的访问,同时通过丰富的数据处理能力更便捷地使用数据。

热门讨论

热门文章

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载