uniapp开发遇到的问题(1)
文件上传
form表单上传中,中有一个file, 后端需要一种二进制格式(巨坑......)
这个东西把我心态搞蹦了,第一次写这个uniapp, 我很正常的本选中的文件后把值赋给file,改变header,其转成formData 传递给后端.传的过程中这个东西变成了[object file],正常来说应该是(binary),于是我入坑了,我开始想办法强制把对象转为(binary)
文件对象获取二进制文件
-
使用
FileReader.readAsBinaryString()MDN 后面面可以查看用法 读取二进制文件 -
发现二进制乱码.通过new String(bytes,0, size, "utf-8") 解决问题
-
发现他不是
(binary),他就是一串String -
接着各种
biadu,google,bing -
.......(裂开)
解决方案
- 换一个请求方式
npm了一个axios, 直接传文件,md竟然就可以了.(再次裂开)
用
axios传值的方式,通过formdata来传参数不要用
uni.request()来请求数据
路由
尽量使用
this.$Router.back()的回退来回退历史(可以从git版本管理来理解这个,回退上一个版本)
this.$Router.replace('')替换当前路由,跳转过后上一个路由就不在存在.直接到上上一个路由
this.$Router.push('')往路由历史加一个路由
封装uni.request请求,可以按照此方法封装axios
method方法
url路由
params参数
beforeCallback封装的调用接口之前执行的方法
afterCallback调用接口之后执行的方法
let ajaxTimes = 0; //处理多个的异步请求
const request = (method, url, params,beforeCallback,afterCallback) => {
ajaxTimes++; //每一个请求都会使计数+1
if(typeof beforeCallback === "function"){
beforeCallback();
}
params = params || {};
params = JSON.parse(JSON.stringify(params));
// 这里一定要做处理
Object.keys(params).forEach( elem => {
if(typeof params[elem] === "object"){
params[elem] = JSON.stringify(params[elem]);
}
})
// 加载页面 动画
uni.showLoading({
title: "加载中",
mask: true,
});
return ... // 这里return一个请求实列对象.
// forExample
return new Promise((resolve,reject)) => {uni.request({
url,
method,
data:params,
success: res => if(res.data.code == 200) {resolve(res)},
fail: res => reject(res),
complete: () => {
ajaxTimes--;
if (ajaxTimes === 0) {
// 关闭正在等待的图标
uni.hideLoading();
}
if(typeof afterCallback === "function"){ afterCallback(); }
}
})}
}
\