uniapp uview 上传图片,数据以formData + File 形式传输

期望

后端期望前端给的传参为 formData 形式, 同时文件的数据类型为File 形式.

解决过程

将文件处理为 File 格式

uview 中的 upload 组件点击上传之后不是标准的 File 形式,点击上传单个文件之后的控制台信息如下:

复制代码
[
    {
        "url": "blob:http://localhost:8081/c16e50ca-767b-4de1-93b4-0446656c3e4d",
        "progress": 0,
        "error": false,
        "file": {
            "name": "440k.jpg",
            "lastModified": 1658970439074,
            "lastModifiedDate": {},
            "webkitRelativePath": "",
            "size": 449462,
            "type": "image/jpeg"
        }
    }
]

故需对 file 内容进行二次加工. 将生成的 blob url 地址处理成 File 文件流形式.

代码如下:

复制代码
// 上传图片回调
onChooseOne(lists) {
	console.log(lists)
	// 将获取到的信息放入上传列表中
	this.pushFileList('fileListOne', lists)
},
// 公共添加文件信息
async pushFileList(fileList, info) {
	this[fileList] = []
	info.forEach(async item => {
		// 加载blob文件
		const imgBlob = await fetch(item.url).then(r => r.blob())
		// 循环生成file文件流
		this[fileList].push({
			url: item.url,
			info: new File([imgBlob], item.file.name, {
				type: item.file.type
			})
		})
	})
},

最后处理完成之后形式如下:

这时要传输的信息已经准备好

将数据其处理成 formData 形式
复制代码
// 将数据处理成formData形式
addForm(params) {
	// 将json数据处理为form格式
	let newFile = new FormData();
	let keys = Object.keys(params);
	let values = Object.values(params);
	values.forEach((item, index) => {
		if (typeof item === 'object' && item) {
			item.forEach((item1) => {
			newFile.append(`${keys[index]}`, item1);
		});
		} else {
			newFile.append(`${keys[index]}`, item);
		}
	});
	return newFile;
},

同时需要更改 api 请求方式. 因为 uniapp 的 uni.request 默认不支持 formData 形式数据, 官网文档如下:

所以我们退而求其次, 直接安装 axios 后, 直接使用 axios 进行请求. 我们需要为请求头增加 formData 请求类型, 最后封装后的 api 请求如下:

复制代码
const url = 'xxx你的请求地址'
const config = {
	headers:{
	'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryXkII0NmP1jsvIgZC'
	}
};
return new Promise((resolve, reject) => {
	axios.post(url, data, config)
		.then((res) => {
			resolve(res)
		})
		.catch((err) => {
			reject(err)
		})
})

结果

最后处理之后的请求数据为表单数据, 接口对接完毕:

相关推荐
liguojun202529 分钟前
智慧破局:重构体育场馆的运营与体验新生态
java·大数据·人工智能·物联网·重构·1024程序员节
宠友信息2 小时前
打造可持续增长的垂直社区:仿小红书平台功能体系与架构深度解析
java·微服务·微信小程序·springboot·uniapp
一点晖光16 小时前
微信小程序输入框光标从中间删除跳到最后bug解决
微信小程序·uniapp·ios光标
苏打水com1 天前
第十篇:Day28-30 工程化优化与部署——从“能跑”到“好用”(对标职场“项目上线”需求)
前端·css·vue·html·js
Yupureki1 天前
《算法竞赛从入门到国奖》算法基础:入门篇-前缀和
c语言·数据结构·c++·算法·1024程序员节
CoderYanger1 天前
动态规划算法-01背包问题:50.分割等和子集
java·算法·leetcode·动态规划·1024程序员节
CoderYanger2 天前
动态规划算法-两个数组的dp(含字符串数组):48.最长重复子数组
java·算法·leetcode·动态规划·1024程序员节
金融小师妹2 天前
美联储议息夜:基于多智能体决策分歧模型的“鹰派降息”推演
人工智能·深度学习·1024程序员节
金融小师妹2 天前
基于NLP政策文本分析与多智能体博弈模拟的FOMC决策推演:“美联储传声筒”下的利率路径分歧
大数据·人工智能·深度学习·1024程序员节
RollingPin2 天前
React Native与Flutter的对比
android·flutter·react native·ios·js·移动端·跨平台开发