微信小程序实现上传图片功能
效果图:
wxml代码:
view class="page-section-title">图片:</view>
<view style="font-size: xx-small; color: tomato;">注:每张照片大写不可超过4M,且最多可以传9张</view>
<view class="weui-uploader">
<view class="img-v weui-uploader__bd">
<view class='pic' wx:for="{{videoPicture}}" wx:for-item="item" wx:key="*this">
<image class='weui-uploader__img ' src="{{item}}" data-index="{{index}}" mode="aspectFill" bindtap="previewTechnician">
</image>
</view>
<button bindtap="technicianImg">选择图片</button>
</view>
</view>
js代码:
data:(){
imgUrl:api.API_IMG_URL, //后端图片服务器地址
videoPicture: [],// 用于记录上传临时文件的图片地址
videoUrls:[],// 实际上传后的地址,用于表单提交时发给后端
}
// 上传图片
technicianImg: function (e) {
var that = this;
var videoPicture = this.data.videoPicture;
console.log( this.data)
if (videoPicture.length >= 9) {
this.setData({
lenMore: 1
});
setTimeout(function () {
that.setData({
lenMore: 0
});
}, 2500);
return false;
}
wx.chooseMedia({
count: 9, // 默认9
mediaType: ['image','video'], // 文件类型
// image 只能拍摄图片或从相册选择图片
// video 只能拍摄视频或从相册选择视频
// sizeType: ['original', 'compressed'], //所选的图片的尺寸 original原图,compressed压缩图
// 仅对 mediaType 为 image 时有效,是否压缩所选文件
sourceType: ['album', 'camera'], //图片和视频选择的来源
maxDuration: 30, // 拍摄视频最长拍摄时间,单位秒。时间范围为 3s 至 60s 之间。不限制相册。
camera: 'back', // 仅在 sourceType 为 camera 时生效,使用前置或后置摄像头
// back 使用后置摄像头;front 使用前置摄像头
success: function (res) {
var tempFilePaths = res.tempFiles;
var videoPicture1 = that.data.videoPicture;
var videoUrls1 = that.data.videoUrls;
for (var i = 0; i < tempFilePaths.length; i++) {
if (videoPicture1.length >= 9) {
that.setData({
videoPicture: videoPicture
});
return false;
} else {
const tempFilePaths1 = tempFilePaths.map(v=>v.tempFilePath)
// tempFilePaths数据是json数组,我们需要的是普通数组需要处理一下
wx.uploadFile({
url: api.UploadFile,//写真实的后端接口地址
filePath: tempFilePaths1[i],
name: "file",
header: {
"content-type": "multipart/form-data"
},
success: function (res) {
var obj = JSON.parse(res.data);
videoPicture1.push(obj.url);
videoUrls1.push(obj.fileName);
that.setData({
videoPicture: videoPicture1,
videoUrls: videoUrls1
});
},
fail: function (err) {
wx.showToast({
title: "上传失败",
icon: "none",
duration: 2000
})
},
})
}
}
}
});
},
// 预览图片
previewTechnician: function (e) {
//获取当前图片的下标
var index = e.currentTarget.dataset.index;
//所有图片
var videoPicture = this.data.videoPicture;
wx.previewImage({
//当前显示图片
current: videoPicture[index],
//所有图片
urls: videoPicture
})
},
// 长按删除
deleteTechnician: function (e) {
var that = this;
var videoPicture = that.data.videoPicture;
var index = e.currentTarget.dataset.index; // 获取当前长按图片下标
wx.showModal({
// cancelColor: 'cancelColor',
title: '提示',
content: '确定要删除此图片吗?',
success: function (res) {
if (res.confirm) {
console.log('确定');
videoPicture.splice(index, 1);
} else if (res.cancel) {
console.log('取消');
return false;
}
that.setData({
videoPicture
})
}
})
},
java后端接口
/**
* 通用上传请求
*/
@ApiOperation(value = "上传图片")
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
try {
// 上传文件路径
String filePath = Config.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);//文件存储方法 可以参考ruoyi-vue框架的文件上传
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", fileName); //这个是去掉ip后存入数据库路径
ajax.put("url", url); //这是带ip的全图片路径,方便直接访问
return ajax;
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}