若是使用的是html5的input type=file,那获取到的file对象是一个base64转码,这样的:html
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4RCcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAOAAAISodpAAQAAAABAA.......html5
是一个很长很长超级长的字符串浏览器
那么在执行图片上传的时候,header中要设置为multipart/form-dataapp
headers.set("Content-Type", "multipart/form-data");
这是由http协议决定的,文件格式都是要以表单的形式提交,具体什么缘由能够本身百度一下,若是有验证的话能够加上post
headers.set("Authorization", "Bearer " + token);
我这里用的是oauth2,因此须要一个tokenthis
这样header的内容就设置完毕了url
图片上传须要使用post请求,图片对象是要加在body里面,这里要新建一个formdata对象:orm
let formParams = new FormData();
formParams.append('file', file);
file就是图片对象,左边key==file这个是固定写法htm
这个file对象不是base64的string,若是传的是base64的string,那在页面上是显示不出来的,这里的file对象应该是二进制格式,二进制格式有arraybuffer,不过arraybuffer是继承自blob对象,因此这里就能够直接new 一个blob对象,将base64转为blob对象,以下:对象
/** * 将dataurl转为blob对象 * @param dataurl * @returns {Blob} */ dataURLtoBlob(dataurl: string) { let arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); }
接下来new一个http请求的参数对象:
let requestOptions: RequestOptionsArgs = new RequestOptions({ method: RequestMethod.Post, headers: ServiceBase.headers, body: formParams, search: queryParameters });
this.http.request(path, requestOptions);
这样就OK了,查看浏览器的network以下:
request payload里面的内容就是由formdata对象本身生成的,我原来看到这样的格式我还觉得是须要本身拼字符串,后来一想,不该该啊,这么复杂怎么可能呢,简直没天理,全部的内容都是formdata对象生成的,我只作了一步,那就是append("file", file)而已