前言
前端使用vue2+elementui2.15.6+axios0.23.0 上傳文件,直連AWS S3。進度條使用elementui2.0中的progress進度條組件。
vue中安裝的aws-sdk為2.235.1版本,即AWS SDK for JavaScript版本2,非最新的版本3
現存問題:版本3缺少認證Amazon cognito身份認證,所在寧夏區,無此服務。不清楚如何使用accessKeyId和secretAccessKey代替cognito直連s3上傳。故使用版本2。
參考鏈接:
https://aws.amazon.com/cn/blogs/china/s3-multipul-upload-practice/
https://www.cnblogs.com/lyjfight/p/12942829.html
重要::雖然我很菜,寫的也不夠好,但我不接受任何批評,本文僅供有需要的人參考及自己記錄用。
效果截圖
點擊文件上傳按鈕,選擇文件,分片上傳,進度條由0到100%,上傳過程中,按鈕禁止點擊。

代碼實現
安裝aws-sdk
npm install aws-sdk@2.235.1
需要獲取AWS的accessKeyId、secretAccessKey、region以及存儲桶名稱。存儲桶需要配置CORS(跨資源共享)
完整代碼
<template>
<div>
<el-button type="primary" @click="fileClick()" :loading="loading">文件上傳</el-button>
<input type="file" id="fileExport" @change="handleFileChange" ref="inputer" style="display:none">
<p>
<el-progress :text-inside="true" :stroke-width="26" :percentage="progress"></el-progress>
</p>
</div>
</template>
<script>
var AWS = require("aws-sdk");
export default {
data() {
return {
s3: new AWS.S3({ // AWS 認證相關
accessKeyId: XXX,
secretAccessKey: XXX,
region: XXX
}),
upload: null,
loading: false, // 防止再次點擊
progress: 0 ,// 進度條
fileName: "", // 文件名稱
suffix: "", // 文件后綴
}
},
methods: {
fileClick: function() { // 點擊button按鈕click事件
this.$refs.inputer.dispatchEvent(new MouseEvent('click')) // 觸發input框的click事件
},
handleFileChange(e) { // 觸發input選擇文件事件
var self = this;
let inputDOM = self.$refs.inputer;
var file = inputDOM.files[0]; // 通過DOM取文件數據
if (file) {
self.loading = true;
self.progress = 0;
self.fileName = file.name;
self.suffix = self.fileName.split(".")[1];
var key = new Date().getTime() + "_" + Math.random().toFixed(2) + "." + self.suffix;
var params = {
Bucket: XXX, // 存儲桶名稱
Key: key, // 文件名,重名會覆蓋
ContentType: file.type, // 文件類型
Body: file, // 具體的文件
'Access-Control-Allow-Credentials': '*',
'ACL': 'public-read'
};
self.upload = self.s3.upload(params, {
// queueSize: 1 // 並發數
}).on('httpUploadProgress', function(e) { // 進度條
var precent = (parseInt(e.loaded, 10) / parseInt(e.total, 10)) * 100;
precent = parseInt(precent.toFixed(2));
setTimeout(function() {
self.progress = precent;
if (precent == 100) {
self.loading = false;
}
}, 3000);
});
self.sendUpload();
}
},
sendUpload: function() { // 上傳文件
var self = this;
self.upload.send(function(err, data) {
if (err) {
console.log("發生錯誤:", err.code, err.message);
self.loading = false;
} else {
console.log("上傳成功, 返回結果");
console.log(data);
var url = data.Location; // 文件訪問地址
}
})
}
},
}
</script>
<style></style>
s3 存儲桶CORS
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"HEAD",
"GET",
"PUT",
"POST",
"DELETE"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag",
"x-amz-meta-custom-header"
]
}
]
