axios上傳文件錯誤:Current?request?is?not?a?multipart?request解決
報錯信息
其實整個過程我一共經歷了三個報錯信息,分別是
1.Current request is not a multipart request:當前請求不是multipart 請求
2.the request was rejected because no multipart boundary was found:請求被拒絕,因為未找到多部分邊界
3.Required request part ‘files’ is not present
報錯產生的程序
我是想在vue中實現(xiàn)一個上傳文件的功能,采用axios方式上傳,數(shù)據模式采用formdata。
然后就產生了各種錯誤。
錯誤解決
Current request is not a multipart request:
這個錯誤是因為后端讀取MultipartFile 類型數(shù)據時,對申請頭的類型進行了一個判斷,他只識別 multipart 開頭的 Content-Type。所以我們需要修改headers 的 Content-Type。
但是手動添加headers會產生 第二個錯誤。所以建議使用formdata 的方式,參數(shù)為formdata 時,瀏覽器會自動添加一個標準的headers。
錯誤:會引發(fā)新的錯誤
var request({ url: 地址, method: 'post', headers:{'Content-Type': 'multipart/form-data'}, data: formdata, })
正確:
let format = new window.FormData(); format.append("file",files[0].raw) let res = await api.test(format) var options({ url: 地址, method: 'post', data: formdata, }) axios(options).then((res) => {console.log(res)})
當然要保證format的key要和后端接收參數(shù)的名稱保持一致,不然會引發(fā)第三個錯誤。
(對了,正常 let format = new FormData();就可以,但一些vue情況下可能會報錯找不到FormData ,就可以試試new window.FormData();)
新的問題
正常情況下此時瀏覽器會自動修改headers的Content-Type,但是我的請求頭的類型依舊沒有變化,經過進一步研究,發(fā)現(xiàn)axios在請求發(fā)送出去之前會進行一次攔截,自動給我們的請求設置一些參數(shù)。所以我們需要修改一下不讓它在修改。最重結果為
let format = new window.FormData(); format.append("file",files[0].raw) let res = await api.test(format) var options({ url: 地址, method: 'post', data: formdata, transformRequest: [function(data, headers) { // 去除post請求默認的Content-Type delete headers.post['Content-Type'] return data }], }) axios(options).then((res) => {console.log(res)})
2.the request was rejected because no multipart boundary was found
這是因為正常的 Content-Type是這樣的
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywdz99kUqBwK48chO
后面會有一個自動生成的boundary來作為分隔符,而人工寫的是沒有的,也很難人工生成。
所以如果想使用multipart/form-data 的話,建議不要人工添加,使用FormData 是較好的辦法。
3.Required request part ‘files’ is not present
這個問題有很多可能性,其中最常見的就是
public void upload(@RequestParam("files") MultipartFile file) throws Exception { System.out.println(file.getOriginalFilename()); }
let format = new window.FormData(); format.append("file",files[0].raw)
后端接受文件的名稱和前端formdata的key鍵不相同,修改為相同就好。
其他還有可能是前端傳參問題,參數(shù)可能并沒有傳送到后端,或者也可能是因為Content-Type的不同導致讀取文件方式不同。
我產生這個報錯是因為Content-Type 不是’multipart/form-data’ ,但是無法通過RequestParam方法獲得formdata中的數(shù)據(接收和傳入的參數(shù)不是文件類型)。
總結
到此這篇關于axios上傳文件錯誤:Current request is not a multipart request解決的文章就介紹到這了,更多相關axios上傳文件錯誤內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue事件監(jiān)聽函數(shù)on中的this指針域使用
這篇文章主要介紹了vue事件監(jiān)聽函數(shù)on中的this指針域使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08