需求描述:
选择本地图片,请求上传图片接口,上传图片接口请求成功后,返回图片线上地址信息,根据图片线上地址信息在页面中显示保存好的图片
上传接口需要图片信息字段格式:二进制
实现方法:
使用 onChange 方法监听 type=“file” input输入框的文件选择动作,在 onChange 方法中请求图片上传接口,请求成功后将返回的图片地址信息保存,显示在页面上
提示:上传到接口的图片信息需要二进制格式,可以使用 FormData 实现
可以F12,查看接口请求信息,请求头发送的数据格式是否为 “Content-Type: multipart/form-data;”
示例:
示例代码使用项目框架: react + ts
html:
<img src="保存后图片线上地址" />
<input type="file" onChange={uploadImgFn} />
ts:
async function uploadImgFn(e: any) {
const form = new FormData();
const file = e.target.files[0]; // 获取图片信息
form.append('pic', file); // 根据接口所需字段,定义 formdata 的 key 和 value
try {
await uploadImgAPI(form); // 根据实际写对应接口
} catch (e) {}
}
遇到问题:使用 FormData 后上传至接口,数据不是 二进制格式
我在请求接口前 使用了 formdata 设置数据,但是传递到接口,接收到数据不是二进制的,
检查 数据格式不是 “Content-Type: multipart/form-data;”,
查看:
项目使用了 umi,封装接口请求文件中,加入了 是否使用formdata 数据格式的判断,是的话,将数据转成formdata 格式,否则普通处理
解决方法:
①在请求接口中,添加 formdata: true
②文件中调用请求接口时,不用先用 formdata 了,直接传递所需键值对,封装的的接口请回会处理成 formdata 格式
async function uploadImgFn(e: any) {
const file = e.target.files[0];
try {
await postProjectImgAPI({ pic: file }, id);
} catch (e) {}
}
如果遇到使用 formdata 后 传递给接口的数据不是二进制的情况,可以检查请求头发送数据格式是否正确,不正确的话检查自己代码请求设置