Laravel 和 Vue.js 使用 Axios 通過(guò) Put 請(qǐng)求上傳文件 獲取不到 Request 數(shù)據(jù),通過(guò) post 傳遞 form 表單添加隱藏方法 _method='put' 解決(踩坑記錄)
說(shuō)明:上傳 Excel 文件做了兩天了,卡在了獲取上傳文件數(shù)據(jù)這里,采用了 Vue.js 作為前端技術(shù)棧,通過(guò) Axios 進(jìn)行接口數(shù)據(jù)請(qǐng)求,所以查到 Axios 官方提供了上傳文件示例
問(wèn)題出現(xiàn)
通過(guò)官方 put 方式提交數(shù)據(jù),獲取不到 Request 信息,直接 Log 中打印出來(lái)是空數(shù)組(后悔當(dāng)初沒(méi)使用 post)
下面為犯錯(cuò)步驟還原:
在 Vue 組件中采用 Axios 官方是上傳文件示例

Laravel路由方式采用 put

使用 chrome Dev Tools 查看 put 請(qǐng)求

控制上傳方法,這里主要想在 laravel 日志中打印上傳的數(shù)據(jù),判斷服務(wù)器是否成功獲取上傳數(shù)據(jù)

Log 中并沒(méi)有數(shù)據(jù)

中間就是漫長(zhǎng)的 2B 試錯(cuò)之旅了
我開(kāi)始想的問(wèn)題是:
1.是不是 new formData()這個(gè)對(duì)象出了問(wèn)題,然后去查 官方文檔,最后發(fā)現(xiàn)這是 H5.js 中的也就是 javascript 原生的對(duì)象,不應(yīng)該出問(wèn)題。。。
2.之后又聯(lián)想到只傳遞普通鍵值對(duì) formdata 試試,發(fā)現(xiàn)仍然不能獲取到數(shù)據(jù):
只上傳鍵值對(duì)
只上傳鍵值對(duì).png
Log 依然沒(méi)有數(shù)據(jù)
Log 依然沒(méi)有數(shù)據(jù).png
3.沒(méi)辦法了,換成 post 上傳試試,結(jié)果發(fā)現(xiàn)有數(shù)據(jù)了。。。
修改為post 路由
修改為post 路由.png
Controller 方法修改顯示請(qǐng)求方式
Controller 方法修改顯示請(qǐng)求方式.png
Log 有數(shù)據(jù)
Log 有數(shù)據(jù).png
至此,試錯(cuò)完畢
問(wèn)題解決,想想就知道可能是 put 方法并沒(méi)有被 laravel 正確解讀,官方文檔中也有 form-method-spoofing 說(shuō)明,按部就班:
web.php 路由

Controller 方法

Vue 組件 Axios

Log 有數(shù)據(jù)

至此,數(shù)據(jù)獲取成功。
總結(jié)
歸根結(jié)底是我沒(méi)有想到 axios其實(shí)也是 ajax 提交,需要 _method 隱藏方法提交,最關(guān)鍵的是我被 laravel 日志誤導(dǎo)了,當(dāng)我使用 put 方法直接提交的時(shí)候是可以出發(fā)控制器方法的(也就是可以打印出空數(shù)組),所以我會(huì)當(dāng)成其實(shí)請(qǐng)求發(fā)送成功并且成功提交的控制器方法中。。。。。。。。。。。。




