在使用阿里云OSS服务时,会用到跨域AJAX上传,上传时报403错误,之前遇到过此类问题并成功解决了,但时间长了遗忘,因此记录下来以备后续学习了解ajax跨域上传OSS。
ajax跨域上传首先会发送options请求,成功后再进行上传,那么,如何解决阿里云OSS跨域AJAX上传OPTIONS请求403问题?只需简单设置,流程如下:
进入存储空间(Bucket) ——> 基础设置 ——> 跨域设置 ——> 添加规则,进入下图所示
设置以上规则后,就成功解决了阿里云OSS跨域AJAX上传OPTIONS请求403问题。
也可以参考
uni.uploadFile h5上传文件失败完美解决方案
,大致问题基本一样。
uni.uploadFile h5上传文件失败完美解决方案
在
小程序开发
项目中,用到了uni-app框架,但因为需要兼容h5,其中有图片上传,后台始终不能获取到上传的文件。
网上找了各种办法,发现很多小程序开发采用uni-app框架都遇到了同样的问题:
uni.uploadFile h5上传文件后台无法获取
,甚至还牵扯到了payload、form data传值方式。
后来,经过创软小程序开发团队不断尝试,发现只要取消header设置即可,不知道为什么,反正这样实现了。
小程序开发的uni-app h5上传文件代码参考如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
uni.uploadFile({
url:
'http://www.teamsfy.com'
, // 后端api接口
filePath: res.tempFilePaths[0],
// uni.chooseImage函数调用后获取的本地文件路劲
name:
'file'
,
//后端通过'file'获取上传的文件对象
formData: {
'billGID'
:
"xxxccc"
,
'token'
:
"dddd"
},
success:(res) => {
console.log(res)
},
fail: (err) => {
console.log(
'uploadImage fail'
, err);
uni.showModal({
content: err.errMsg,
showCancel:
false
});
}
});
|
当然,如果用到了跨域,需要设置 OPTIONS 请求,因为表单跨域上传文件,会先发送OPTIONS请求验证服务器是否可用。asp.net 跨域,在web.config中配置如下
1
2
3
4
5
6
7
8
9
|
<
system.webServer
>
<
httpProtocol
>
<
customHeaders
>
<
add
name
=
"Access-Control-Allow-Methods"
value
=
"OPTIONS,POST,GET"
/>
<
add
name
=
"Access-Control-Allow-Origin"
value
=
"*"
/>
</
customHeaders
>
</
httpProtocol
>
</
system.webServer
>
|
如果使用的阿里云OSS服务,阿里云OSS前端AJAX直接上传请参考
阿里云OSS上传请求403问题的完美解决方案
。
转载于:
http://www.teamsfy.com/html/r_da159c3b48f94f30927e899651064c47.html
http://www.teamsfy.com/html/r_28d3748f7a0449d8aeac8dd78a547f6e.html
在使用阿里云OSS服务时,会用到跨域AJAX上传,上传时报403错误,之前遇到过此类问题并成功解决了,但时间长了遗忘,因此记录下来以备后续学习了解ajax跨域上传OSS。ajax跨域上传首先会发送options请求,成功后再进行上传,那么,如何解决阿里云OSS跨域AJAX上传OPTIONS请求403问题?只需简单设置,流程如下:进入存储空间(Bucket) ——> 基础设置 ——> 跨域设置 ——> 添加规则,进入下图所示设置以上规则后,就成功解决了阿...
阿里云
OSS
是
阿里云
提供的海量、安全、低成本、高可靠的云存储服务,提供 99.9999999999%的数据可靠性(号称)。能够使用 RESTful API 可以在互联网任何位置存储和访问,支持容量和处理能力弹性扩展。
1.bucket :类似本地的一个文件夹
2.object :
oss
存储数据的基本单元,类似本地的一个文件。
3.region:
oss
存储的数据中心所在区域
4.Endpoint:
oss
对外服务的访问域名,
oss
以 http api 提供服务,不同 region 的 edpoint 不同。
5.AccessKey:访问秘钥,简称 AK,包括 Acc
uni
-
app
版本升级后出现下面的
问题
,起初以为是
OSS
的
问题
,后来发现旧版本可以
上传
成功,新版本
上传
报错,所以以为是版本的
问题
,下了好几个版本试,发现都不可以。折腾来折腾去最后发现注释一行代码就好了。
OSS
实现
使用插件
oss
util
控制台输出
"data": "https://xxxx.
oss
-cn-hangzhou.aliyuncs.com",
"statusCode":
403
,
"errMsg": "
upload
File
:ok"
找到crypto.js文件,注释以下代码
处理方法:
您好,您这个是跨域,不是鉴权的
问题
,前端
上传
的话,一般都是要求跨域的,跨域设置方法是:
https://help.aliyun.com/document_detail/31903.html?spm=a2c4g.11174283.6.1124.369f7da2kWLpA2
设置内容如下:
允许method:全部勾选
允许headers:*
暴露header:
x-
oss
-request-id
其他保持默认
Browser.js
官方文档:https://help.aliyun.com/document_detail/64040.html
GITHUB地址:https://gitee.com/mirrors/ali-
oss
GITEE镜像地址:https://github.com/ali-sdk/ali-
oss
示例:列出所有对象(测试bucket,对象数量较少)
</head>
<body>&l
问了
阿里云
客户,然并卵!浪费时间!发一堆文档给我看!我要看了解决,早就看了解决了!
看是否配置了跨域设置。我自己是配置了的,还是报错
403
。
于是我用python代码requests尝试,竟然可以成功!
但是前端vue的同事调用一直
403
报错!
经过对比2个的区别,python代码里没有设置Content-Type,在Postman里试了下,果断如此。
错误还原:我在做
OSS
文件
上传
头像时,发现头像的图片文件可以
上传
成功,也可以返回文件的路径。但是前端在拿着后端返回的文件图片路径去访问这个图片时,Response中的错误码为
403
。找了一下网上的资料,发现添加了这两行代码,
问题
就解决了::
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("image/jpg");
阿里云
个人文件完整代码如下
@Service
public class
import java.io.
File
;
import com.aliyun.
oss
.
OSS
;
import com.aliyun.
oss
.
OSS
ClientBuilder;
import com.aliyun.
oss
.model.PutObjectResult;
public class
Oss
Utils {
private static String endpoint = "yourEndpoint"; //
OSS
endpoint
private static String accessKeyId = "yourAccessKeyId"; // AccessKeyId
private static String accessKeySecret = "yourAccessKeySecret"; // AccessKeySecret
private static String bucketName = "yourBucketName"; // bucket name
//
上传文件
public static String
upload
File
(String objectName, String
file
Path) {
// 创建
OSS
Client实例。
OSS
oss
Client = new
OSS
ClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
//
上传文件
到
阿里云
OSS
PutObjectResult result =
oss
Client.putObject(bucketName, objectName, new
File
(
file
Path));
// 获取文件下载链接
String
file
Url =
oss
Client.generatePresignedUrl(bucketName, objectName, //
file
key
new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10), // URL有效期
HttpMethod.GET // HTTP
请求
方法
).toString();
return
file
Url;
} finally {
// 关闭
OSS
Client。
oss
Client.shutdown();
其中,`objectName`为文件在
OSS
上的唯一标识符,`
file
Path`为本地文件路径。在
上传
成功后,通过`generatePresignedUrl`方法获取文件下载链接,设置有效期可根据需要调整。