. 前言

我们将使用微信小程序的`wx.uploadFile`方法来实现用户上传图片的功能。

2. 需求

博主需要开发一个用户投诉页面,用户可以上传最多三张图片,并将这些图片、文字和用户信息一起提交给服务器。

3. 解决思路

我们将使用`wx.uploadFile`方法来实现图片上传功能。

4. 代码展示

首先,在页面的初始化数据中,我们需要定义两个数组:`imgs`用于存储要上传的图片列表,`imgPath`用于存储已上传成功的图片路径。

```javascript

Page({

data: {

imgs: [], // 上传图片列表

imgPath: [], // 已上传成功的图片路径

},

})

```

接下来,我们编写上传图片的函数。在这个函数中,我们将使用`wx.chooseImage`方法让用户选择图片,然后使用`wx.uploadFile`方法将选中的图片上传到服务器。

```javascript

Page({

// ...其他代码

uploadImages() {

const that = this;

wx.chooseImage({

count: 3, // 最多上传3张图片

sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有

sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有

success: function (res) {

// tempFilePath可以作为img标签的src属性显示图片

const tempFilePaths = res.tempFilePaths;

that.setData({ imgs: tempFilePaths });

that.uploadFiles(tempFilePaths);

},

fail: function (err) {

console.log('上传失败', err);

},

});

},

})

```

最后,我们编写`uploadFiles`函数,该函数接收一个包含已上传成功图片路径的数组,并将其与用户信息一起提交给服务器。

```javascript

async function uploadFiles(filePaths) {

for (let i = 0; i < filePaths.length; i++) {

try {

const filePath = filePaths[i];

const result = await wx.cloud.uploadFile({ cloudPath: 'images/' + (i + 1), filePath }); // 将文件上传到云服务器的images文件夹下,文件名按顺序递增1

const imageUrl = result.fileID; // 获取文件在云服务器上的URL地址

const formData = new FormData(); // 根据表单提交方式创建表单对象

Object.keys(this.data).forEach((key) => { // 将数据添加到表单对象中,注意data中的字段需要与后端接口一致

formData.append(key, this.data[key]);

});

formData.append('image', imageUrl); // 将图片URL地址添加到表单对象中,与后端接口一致即可

const serverUrl = 'https://example.com/api/submit'; // 将此URL替换为实际的后端接口地址

const response = await wx.request({ url: serverUrl, method: 'POST', data: formData }); // 通过POST请求将数据提交给后端接口,注意url和method需要根据实际情况进行修改

console.log('提交成功', response); // 在控制台输出服务器返回的数据,如果有错误可在此进行处理或提示用户操作不成功的原因

} catch (error) {

console.error('上传失败', error); // 在控制台输出错误信息,方便调试和分析问题原因

} finally {

i++; // 继续上传下一张图片,循环执行uploadFiles函数即可实现多张图片同时上传的功能。

以下是重构后的代码:

```javascript

// 上传照片 chooseImg (e) {

const _this = this;

let imgs = this.data.imgs;

let imgNumber = this.data.imgs.length; //当前已上传的图片张数

if (imgNumber >= 3) {

FN.Toast("超出上传个数");

return false;

} else {

imgNumber = 3 - imgNumber;

};

wx.chooseImage({ //打开本地相册选择图片

count: imgNumber,

sizeType: ["original", "compressed"],

sourceType: ["album", "camera"],

success(res) {

const tempFilePaths = res.tempFilePaths;

for (let i = 0; i < tempFilePaths.length; i++) {

imgs.push(tempFilePaths[i]);

}

_this.setData({ //赋值,回显照片

imgs: imgs

});

let successUp = 0; //成功

let failUp = 0; //失败

let count = 0; //第几张

let length = tempFilePaths.length; //总数

_this.recursionUploading(tempFilePaths, successUp, failUp, count, length); //调用上传方法

}

})

},

recursionUploading(tempFilePaths, successUp, failUp, count, length) {

if (count === length) {

return;

} else {

wx.uploadFile({

url: 'your upload url', //你的上传地址

filePath: tempFilePaths[count],

name: 'file', //文件对应表单字段名

formData: {

'user': 'test' //其他额外的表单数据

},

success(res) {

console.log("success", res); //上传成功后的操作,比如更新成功上传的数量等操作。可根据实际情况修改。

successUp++; //上传成功数量加1,用于判断是否所有图片都已经上传完成。可根据实际情况修改。

}

}).catch((err) => {

console.log("error", err); //上传失败后的操作,比如更新失败上传的数量等操作。可根据实际情况修改。 FAILURE UP++; //上传失败数量加1,用于判断是否所有图片都已经上传完成。可根据实际情况修改。 });

}

}

```

以下是重构后的内容:

```

// 采用递归的方式上传图片

function recursionUploading(imgPaths, successUp, failUp, count, length) {

var _this = this;

wx.showLoading({

title: `正在上传第${count}张`

});

wx.uploadFile({

url: `${app.globalData.baseURL}/api接口地址`,

filePath: imgPaths[count],

formData: {

userId: app.globalData.userMsg.userId

},

name: 'uploadImage',

header: {

'content-type': 'multipart/form-data'

},

success(e) {

_this.setData({

imgPath: [..._this.data.imgPath, e.data]

}); // 将成功上传的图片路径添加到imgPath数组中

successUp++; // 成功+1

_this.handleUploadSuccess(); // 调用处理成功上传的方法

},

fail(e) {}, // 如果上传失败,暂时不做处理

complete() {}, // 如果上传完成,暂时不做处理

});

}

```

您好,根据您的需求,您可以使用微信小程序提供的API来实现预览大图的功能。具体来说,您可以使用`wx.previewImage()`方法来实现这个功能。下面是一个简单的示例代码:

```javascript

lookBigImg (e) {

let index = e.currentTarget.dataset.index; //索引

let big = this.data.imgs[index];

wx.previewImage({

current: big, // 当前显示图片的http链接

urls: this.data.imgs // 需要预览的图片http链接列表

});

}

```