前两天在公司,一个同事过来问我一个H5应用的问题;那个H5应用使用uni-app来编写的;遇到一个上传图片的问题,采用uni.chooseImage这个api来选择图片,选择成功后会返回一个临时的dataUrl,按道理来说,我们只需要把这个临时的路径通过uni.uploadFile发送给后端,后端就可以通过这个路径取得到当前的图片的二进制文件了;但是这里有个问题--跨域;即使后端设置了允许跨域,但是一样不行(也不知道是不是后端蒙我);所以后来就还是用axios来进行发文件;这时候我们就需要把dataUrl转成file并用一个对象保存起来,然后通过FormData的方式发送过去;废话不多说了,先上代码吧!
let http = new XMLHttpRequest();
http.open("GET",dataUrl,true);
http.responseType = 'blob';// 这里是以流的方式返回数据的
http.onload = function(e){
if(this.status === 200 || this.status === 0){
let file = new window.File([this.response],'test.jpg',{type: "image/jpeg"})
// 这里就可以把file发给后端了
}
}
我就按照我的理解稍微解释一下;这个的dataUrl其实也算是地址,通过get的方式拿到response,再进行处理即可;这里用了一个File的api,此api的相关资料请另行查阅。
对了,需要注意的是,window.File在小程序上是没有的,因为小程序是没有window这个对象的
h5的应用还是不要用uni-app来写比较好,太恶心了,插件库一塌糊涂