问题描述
文件通过FormData的方式去上传,头部字段content-type字段设置为multipart/form-data
,会导致后端无法解析文件内容,导致文件上传失败。
解决方案
文件上传header字段无需设置multipart/form-data
,因为如果设置了multipart/form-data
将导致content-type没有边界boundary,从而使得后端无法解释文件流。因为这种情况下建议,header不对content-type进行设置,使用浏览器默认匹配的content-type。
ps,个人封装的ajax库代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| const ajax = opt => { opt = opt || {} opt.method = opt.method.toUpperCase() || 'POST' opt.url = opt.url || '' opt.async = opt.async || true opt.data = opt.data || {} opt.success = opt.success || (() => {}) opt.fail = opt.fail || (() => {}) opt.header = opt.header || {} opt.contentType = opt.contentType || '' const xmlHttp = new XMLHttpRequest() let params = [] if (typeof opt.data === 'object') { for (let key in opt.data){ params.push(key + '=' + opt.data[key]) } } let postData = params.join('&')
if (opt.method.toUpperCase() === 'POST') { xmlHttp.open(opt.method, opt.url, opt.async) for (const headerKey in opt.header) { xmlHttp.setRequestHeader(headerKey, opt.header[headerKey]) } if (opt.data.constructor === FormData) { xmlHttp.setRequestHeader('Accept', '*/*') xmlHttp.send(opt.data) } else if (/application\/x-www-form-urlencoded/i.test(opt.contentType)) { xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8') xmlHttp.send(postData) } else { xmlHttp.setRequestHeader('Content-Type', 'application/json;charset=utf-8') xmlHttp.send(JSON.stringify(opt.data)) } } else if (opt.method.toUpperCase() === 'GET') { if (postData) { if (opt.url.indexOf('?') > -1) { opt.url += '&' + postData } else { opt.url += '?' + postData } } xmlHttp.open(opt.method, opt.url, opt.async) for (const headerKey in opt.header) { xmlHttp.setRequestHeader(headerKey, opt.header[headerKey]) } xmlHttp.send(null) } xmlHttp.onreadystatechange = function () { if (xmlHttp.readyState === 4) { if (xmlHttp.status === 200) { opt.success(xmlHttp.responseText) } else { opt.fail(xmlHttp.responseText) } } } }
|