238 lines
5.9 KiB
Vue
238 lines
5.9 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="upload-content" :style="'width:'+width">
|
|||
|
|
<view
|
|||
|
|
v-for="(item, index) in photo"
|
|||
|
|
:key="index"
|
|||
|
|
class="image-preview"
|
|||
|
|
>
|
|||
|
|
<image
|
|||
|
|
:src="item"
|
|||
|
|
mode="aspectFill"
|
|||
|
|
class="preview-image"
|
|||
|
|
@click="previewImage(photo,index)"
|
|||
|
|
></image>
|
|||
|
|
<view class="delete-btn" @click="deleteImage(index)">×</view>
|
|||
|
|
</view>
|
|||
|
|
<view
|
|||
|
|
v-if="photo.length < maxNum"
|
|||
|
|
class="upload-btn"
|
|||
|
|
@click="chooseImage"
|
|||
|
|
>
|
|||
|
|
<text class="plus-icon">+</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
<script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
|
|||
|
|
<script>
|
|||
|
|
import request from '../../utils/request';
|
|||
|
|
export default {
|
|||
|
|
name:"upload-img",
|
|||
|
|
props: {
|
|||
|
|
photo: {
|
|||
|
|
type: Array,
|
|||
|
|
default: []
|
|||
|
|
},
|
|||
|
|
maxNum: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 1
|
|||
|
|
},
|
|||
|
|
width: {
|
|||
|
|
type: String,
|
|||
|
|
default: ''
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
},
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
imagesList: []
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
chooseImage() {
|
|||
|
|
let that = this;
|
|||
|
|
uni.chooseImage({
|
|||
|
|
count: that.maxNum - that.photo.length,
|
|||
|
|
sizeType: ['original', 'compressed'],
|
|||
|
|
sourceType: ['album'],
|
|||
|
|
success: (res) => {
|
|||
|
|
// 处理文件大小限制
|
|||
|
|
const validFiles = res.tempFiles.filter(file => {
|
|||
|
|
const isValidSize = file.size < 10 * 1024 * 1024 // 10MB限制
|
|||
|
|
if (!isValidSize) {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '图片大小不能超过10MB',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
return isValidSize
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 添加到媒体列表
|
|||
|
|
const newImages = validFiles.map(file => ({
|
|||
|
|
type: 'image',
|
|||
|
|
url: file.path,
|
|||
|
|
size: file.size
|
|||
|
|
}))
|
|||
|
|
console.log('newImages',newImages)
|
|||
|
|
that.imagesList = newImages;
|
|||
|
|
that.uploadPhoto();
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
// 上传图片接口
|
|||
|
|
async uploadPhoto() {
|
|||
|
|
let that = this;
|
|||
|
|
// 刷新token
|
|||
|
|
const newToken = await request.post('/user/refreshtoken',{refresh_token: uni.getStorageSync('refreshToken'),deviceid: getApp().globalData.deviceid})
|
|||
|
|
// 2. 保存到本地
|
|||
|
|
uni.setStorageSync('accessToken',newToken.access_token)
|
|||
|
|
uni.setStorageSync('refreshToken',newToken.refresh_token)
|
|||
|
|
|
|||
|
|
const promises = that.imagesList.map(item => {
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
request.uploadImage('/user/uploadphoto',item.url,{type: item.type}).then(res=>{
|
|||
|
|
console.log('res==========',res)
|
|||
|
|
resolve(res)
|
|||
|
|
}).catch(err=>{
|
|||
|
|
reject(err)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
|
|||
|
|
// const client = new OSS({
|
|||
|
|
// // yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
|
|||
|
|
// region: "oss-cn-changzhou",
|
|||
|
|
// authorizationV4: true,
|
|||
|
|
// // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
|
|||
|
|
// accessKeyId: "LTAI5tGsiEK2Zuat4bJSHXs9",
|
|||
|
|
// accessKeySecret: "x9ToLlfdcgg2sGnyfVpQWGVLfEdG3E",
|
|||
|
|
// // 从STS服务获取的安全令牌(SecurityToken)。
|
|||
|
|
// stsToken: "yourSecurityToken",
|
|||
|
|
// // 填写Bucket名称。
|
|||
|
|
// bucket: "mrrplus",
|
|||
|
|
// });
|
|||
|
|
|
|||
|
|
// // 从输入框获取file对象,例如<input type="file" id="file" />。
|
|||
|
|
// let data;
|
|||
|
|
// // 创建并填写Blob数据。
|
|||
|
|
// //const data = new Blob(['Hello OSS']);
|
|||
|
|
// // 创建并填写OSS Buffer内容。
|
|||
|
|
// //const data = new OSS.Buffer(['Hello OSS']);
|
|||
|
|
|
|||
|
|
// const upload = document.getElementById("upload");
|
|||
|
|
|
|||
|
|
// async function putObject(data) {
|
|||
|
|
// try {
|
|||
|
|
// // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
|
|||
|
|
// // 您可以通过自定义文件名(例如exampleobject.txt)或文件完整路径(例如exampledir/exampleobject.txt)的形式实现将数据上传到当前Bucket或Bucket中的指定目录。
|
|||
|
|
// // data对象可以自定义为file对象、Blob数据或者OSS Buffer。
|
|||
|
|
// const options = {
|
|||
|
|
// meta: { temp: "demo" },
|
|||
|
|
// mime: "json",
|
|||
|
|
// headers: { "Content-Type": "text/plain" },
|
|||
|
|
// };
|
|||
|
|
// const result = await client.put("examplefile.txt", data, options);
|
|||
|
|
// console.log(result);
|
|||
|
|
// } catch (e) {
|
|||
|
|
// console.log(e);
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// upload.addEventListener("click", () => {
|
|||
|
|
// const data = file.files[0];
|
|||
|
|
// putObject(data);
|
|||
|
|
// });
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
Promise.all(promises)
|
|||
|
|
.then(result => {
|
|||
|
|
var arr = [];
|
|||
|
|
result.forEach((element,i)=>{
|
|||
|
|
arr[i] = element.path;
|
|||
|
|
})
|
|||
|
|
// that.photo = that.photo.concat(arr);
|
|||
|
|
that.$emit('addImg',arr)
|
|||
|
|
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '上传成功'
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
})
|
|||
|
|
.catch(err => {
|
|||
|
|
console.log('上传结果err',err)
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '上传失败',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
// 删除图片
|
|||
|
|
deleteImage(index) {
|
|||
|
|
this.$emit('deleteImage',index)
|
|||
|
|
},
|
|||
|
|
previewImage(urls, current) {
|
|||
|
|
uni.previewImage({
|
|||
|
|
urls: urls,
|
|||
|
|
current: current
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped>
|
|||
|
|
.upload-content {
|
|||
|
|
/* width: 750rpx; */
|
|||
|
|
display: grid;
|
|||
|
|
grid-template-columns: repeat(3, 1fr);
|
|||
|
|
justify-items: center;
|
|||
|
|
align-items: center;
|
|||
|
|
margin-top: 20rpx;
|
|||
|
|
position: relative;
|
|||
|
|
}
|
|||
|
|
.image-preview,
|
|||
|
|
.upload-btn {
|
|||
|
|
width: 200rpx;
|
|||
|
|
height: 200rpx;
|
|||
|
|
margin-bottom: 20rpx;
|
|||
|
|
position: relative;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.preview-video,
|
|||
|
|
.preview-image {
|
|||
|
|
width: 200rpx;
|
|||
|
|
height: 200rpx;
|
|||
|
|
border-radius: 8rpx;
|
|||
|
|
margin-right: 18rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.upload-btn {
|
|||
|
|
border: 2rpx dashed #DDDDDD;
|
|||
|
|
border-radius: 8rpx;
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: center;
|
|||
|
|
align-items: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.plus-icon {
|
|||
|
|
font-size: 60rpx;
|
|||
|
|
color: #999999;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.delete-btn {
|
|||
|
|
position: absolute;
|
|||
|
|
top: -20rpx;
|
|||
|
|
right: -20rpx;
|
|||
|
|
width: 40rpx;
|
|||
|
|
height: 40rpx;
|
|||
|
|
background-color: rgba(0, 0, 0, 0.5);
|
|||
|
|
border-radius: 50%;
|
|||
|
|
color: #FFFFFF;
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: center;
|
|||
|
|
align-items: center;
|
|||
|
|
font-size: 32rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
</style>
|