700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 前端阿里云oss直传图片遇到的问题与解决方案 vant + vue3 + oss

前端阿里云oss直传图片遇到的问题与解决方案 vant + vue3 + oss

时间:2019-03-23 09:10:15

相关推荐

前端阿里云oss直传图片遇到的问题与解决方案 vant + vue3 + oss

目前我尝试了两种方案,第一种没调试通,可能我方式不对,求大佬看看问题出现在哪

1、使用签名URL进行临时授权

根据官网操作授权访问 ()

大致流程是

1. 前端先安装阿里云oss的browser.js,可通过npm或者cdn直接引入。

2. 获取临时授权访问oss凭证。

3.客户端使用sts构造签名请求 代码来自官网

// 向您搭建的STS服务获取临时访问凭证。fetch('http://your_sts_server/').then(resp => resp.json()).then(result => {const store = new OSS({// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。accessKeyId: result.AccessKeyId,accessKeySecret: result.AccessKeySecret,// 从STS服务获取的安全令牌(SecurityToken)。stsToken: result.SecurityToken,// 填写Bucket所在地域。以华东1(杭州)为例,设置region为oss-cn-hangzhou。region: 'oss-cn-hangzhou',// 填写Bucket名称,例如examplebucket。bucket: 'examplebucket'});// 生成签名URL。// 填写Object完整路径,例如ossdemo.txt。Object完整路径中不能包含Bucket名称。const url = store.signatureUrl('ossdemo.txt');console.log(url);})

4.使用签名URL进行临时授权 代码来自官网

// 以下代码用于生成对象签名URL。const url = store.signatureUrl('exampleobject.txt');console.log(url);// 获取上传exampleobject.txt文件的签名URL。const url = store.signatureUrl('exampleobject.txt', {// 设置过期时间为3600秒。expires: 3600,// 设置请求方式为PUT。默认请求方式为GET。method: 'PUT'});console.log(url);const url = store.signatureUrl('exampleobject.txt', {expires: 3600,method: 'PUT',// 设置Content-Type。'Content-Type': 'text/plain; charset=UTF-8',});console.log(url);// 获取下载exampleobject.txt文件的签名URL,使用浏览器访问时默认直接预览要下载的文件。const url = store.signatureUrl('exampleobject.txt', {expires: 3600,response: {'content-type': 'text/custom',// 获取下载exampleobject.txt文件的签名URL,配置文件HTTP头中的Content-Disposition为attachment,实现浏览器访问时自动下载文件,并自定义下载后的文件名称。// 如果您希望直接在浏览器中预览文件,配置文件HTTP头中的Content-Disposition为inline并使用Bucket绑定的自定义域名进行访问。'content-disposition': 'attachment'}});console.log(url);

// 生成带有图片处理参数的签名URL// 获取图片文件exampleobject.png签名URL。// 填写不包含Bucket名称在内的Object完整路径。const url = store.signatureUrl('exampleobject.png', {// 设置图片处理参数。process: 'image/resize,w_200'});console.log(url);// 设置过期时间为3600秒。const url = store.signatureUrl('exampleobject.png', {expires: 3600,process: 'image/resize,w_200'});console.log(url);

5. 使用签名url上传文件 代码来自官网

// signatureUrl填写生成的签名URL。const url = 'signatureUrl'; var xhr = new XMLHttpRequest();xhr.open('PUT', url, true);xhr.onload = function () {// 请求结束后,在此处编写处理代码。};xhr.send(null);// xhr.send('string');// xhr.send(new Blob());// xhr.send(new Int8Array());// xhr.send({ form: 'data' });// xhr.send(document);

问题就来了,在跟后端商量好以后,觉得在前端写AccessKey ID,bucket等不安全,会暴露。所以3和4部在后端进行完成,前端操作如下:

1. 像后端发送请求,请求内容为图片类型(.jpg / .png这些) 后端返回生成的签名url

url地址为: oss服务器地址 + / xxx.jpg (xxx为后台随机生成文件名)

2. 我拿到签名url以后,直接给这个url地址发送put请求,携带请求头: 'x-oss-storage-class' : 'Standard' 和 file文件

结果并不能通,报403错误 访问被拒绝。求大佬解决一下错误的原因

2、服务端签名后直传 (成功的方案)

参考链接:vue+element-ui+阿里云oss服务端签名后直传图片的示例 - 简书 ()

参考链接:前后端分离。前端实现参数签名,后端实现接口验签_Anliexo的博客-CSDN博客_前后端验签

官方文档:服务端签名后直传 ()

后台直接参考官网

前端: vant3中Uploader 文件上传处理方式

1. Uploader 文件调用after-read文件读取完成后的回调函数 并且ResultType为file

<van-uploader v-model="fileList" multiple :after-read="afterRead" result-type="file"/>

2. 在after-read函数内 还是向后台发送请求,拿到accessid、dir、expire、host、name、policy、signature

3. 构造formData格式, 并且把上述参数添加进来

const formData = new FormData();formData.append("key", imgToken.name)formData.append("success_action_status", 200)formData.append("OSSAccessKeyId", imgToken.accessid)formData.append("policy", imgToken.policy)formData.append("signature", imgToken.signature)

注意:accessid 官网写的是accessid, 实际上要传 OSSAccessKeyId (贼坑)

success_action_status 不传200 如果上传成功会返回204

key必传! key为 oss路径地址 /xxxx.jpg 不包含oss服务器地址

4. 把files文件也添加进来

formData.append('file', files.file)

5. 发送post请求, url为oss文件服务器地址 ,data为formData

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。