当前位置: 首页>后端>正文

vue3 +vite aws上传(二)

上篇写了oss上传,这篇写aws上传的方式,因为以前没用过aws上传,公司业务涉及到了海外客户,海外就用aws上传,但这里坑就特别多,先讲讲简单上传吧,aws的参数、方法网上一大堆,官方文档只是简单的案例,真正还是要靠自己探索出来,今天记录一下

1、说一下aws的s3.upload上传方式,这里要引入aws-sdk,引入后部署到dorker上就会报错,然后在index.html引入https://cdn.bootcdn.net/ajax/libs/aws-sdk/2.1167.0/aws-sdk.min.js并没有报错,用webpack的dome测试发现正常,怀疑是vite打包导致的冲突问题

下面是aws的s3.upload上传方式

const credentials = {accessKeyId:awsData.value.accessid, secretAccessKey:awsData.value.secret};

(window as any).AWS.config.update(credentials);

(window as any).AWS.config.region =document.domain.includes('eu') ?awsData.value.cdnDomain:awsData.value.host;? //设置区域

const s3 =new (window as any).AWS.S3();

const params:any = {

? Bucket:awsData.value.bucket,

? Key:awsData.value.dir +'/' +randomString(8) +'_' +Date.now() +'.' +file.value.name.split('.')[file.value.name.split('.').length -1],

? Body:file.value,

? 'Access-Control-Allow-Credentials':'*'

};

percentage.value =0

awsUploadEvent =await s3.upload(params, {}).on('httpUploadProgress', (e:any) => {

let precent = (parseInt(e.loaded, 10) /parseInt(e.total, 10)) *100;

? precent =parseInt(precent.toFixed(2));

? percentage.value = precent;

});

2、aws.upload就仅有这么点代码, 但也弄了很久,因为之前用的不是upload,参数也没有那么少,最后呢,后端开始不再返回secret,就直接put返回的url,这种上传方式,不仅不用引入aws-sdk,也不用在index.html中引入js,简化了步骤,下面来看看

let domain ='';

//把欧服url域名替换为cdn,后端返回的url中包含了bucket和host,要把域名全部替换为cdn加速

if (cdnDomain) {?

domain = url.split('//')[1];

? ? domain = domain.split('/')[0];

? ? url = url.replace(domain, cdnDomain)

}

//请求头配置

const awsConfig = {

headers: {'Content-Type':'multipart/form-data'} //图片可以用这个,但如果是设备的话就要换成二进制的'Content-Type': 'application/octet-stream'

};

//正式上传

let result =new Promise(async (resolve, reject) => {

//aws规定要用put,不能用post

? ? await axios.put(url, file, awsConfig)

.then(res => {

if (res.status ==200) {

? ? ? ? ? ? ? ? resolve(url);

? ? ? ? ? ? }

}).catch(err => {

reject(err)

}

)

})

return result;

不管是oss还是aws,我都推崇第二种方式,在后端签名返回,前端用post或者put上传,就不需要前端引入任何东西。

还有一个手机端用uni-app上传的,也做了封装,因为是uni.chooseImage选择的图片,用的不能是blob链接,这个要记住,用的是他的file,就是res.tempFiles里面的东西,在我的电商项目pages/commonAction/uploadImage里面,这个本来想放到npmjs上的,后来还是没有放上去


https://www.xamrdz.com/backend/33z1944789.html

相关文章: