管理咨詢公司有哪些如何網(wǎng)頁優(yōu)化
今天在上課的時候,遇到了一個比較坑的問題,有個學生拿來了她的代碼,讓我給她看看為什么傳值傳不過來。
首先,前端是這樣的:
function upload(){var formData = new FormData();formData.append('images', $('#previewImg')[0].files[0]);var id1=$("input[name='id']").val()formData.append('id', id1);$.ajax({type:"post",processData: false,contentType: false,url:"uploadImage",data:formData,success:function(data){}});
}
后端是這樣的:
@PostMapping("/uploadImage")public Map uploadImage(Integer id,MultipartFile images,HttpSession session){
// System.out.println(id);
// System.out.println(images);}}
然后上傳文件的配置器是這樣的:
<bean id="CommonsMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="1048675000"/>
<property name="maxUploadSizePerFile" value="1048675000"/>
</bean>
她遇到的第一個問題是,后端這里接受值的時候,接受到的id和文件都是null,然后再后續(xù)的使用中報空指針了。
看起來就是一個很簡單的空指針問題,我拿來查的時候,先看了一下她這邊的前段,開始我沒有注意到是使用的fromdata,我以為是普通的json傳輸,而且在network中也很明顯能看到請求頭和帶的參數(shù)。
后端可以報空指針,說明后端的代碼也進去了,說明請求頭也沒問題。
所以我覺得問題原因可能出在請求頭接受值的地方(事實證明,老中醫(yī)的直覺是對的)
所以我把她的后端代碼頭做了修改。:
public Map uploadImage(HttpServletRequest request,HttpSession session){
用HttpServletRequest 來接受試試(這時候我還沒注意到fromdata)然后發(fā)現(xiàn),在req中也獲取不到id,我有點麻了,我覺得可能是寫法問題,導致這個數(shù)據(jù)不在req里面,我再換個寫法:
public Map uploadImage(@RequestParam Integer id,@RequestParam MultipartFile images,HttpSession session){
可能是我對HttpServletRequest 忘記的多,找不到值在哪兒,我直接用注解去取值看看,結(jié)果發(fā)現(xiàn)還是null。我當時就無語了,這他媽的。
然后我就又回頭去看前段,既然這里折騰半天沒效果,不如換個陣地。之前前端傳后端沒見過二進制的文件流啊,是不是因為這玩意的原因?我去前段把她這里set文件的地方給她注掉了,我心想,這不就變成了一個普通的ajax了么,這不應(yīng)該有問題吧。
然后我就去后端看,上面的三板斧又轉(zhuǎn)了一圈,還不行。我真是見了鬼了。
然后學生和我說,老師是不是fromdata的問題。
我一看,這里怎么還不一樣呢,我以為這里就是個普通的json。
完了又看了倆眼這個fromdata的用法,很簡單啊,前段傳值,后端接收,沒毛病啊。這還有什么問題不成?
搜了一下fromdata使用的時候注意事項,有文章說要加個注解@MultipartConfig,但是我試過了,發(fā)現(xiàn)還是null,這怎么可能啊!我要顏面掃地了。
這個時候這個問題已經(jīng)看了接近2個小時了,這個時候?qū)W生吐槽說,一般這種一看看一天的問題,八成是什么小問題,不知道哪兒寫錯了。
我也同意這種想法,于是,我的目光又回到了后端的接受請求的地方:
public Map uploadImage(Integer id,MultipartFile images,HttpSession session){
她這里前端fromdata設(shè)置值的時候,先塞的file,后塞的id,會不會是這里接受參數(shù)的順序有影響?
然后我把這句改了一下:
public Map uploadImage(MultipartFile images,Integer id,HttpSession session){
對,沒錯,我調(diào)換了倆個參數(shù)的位置試了一下(死馬當活馬醫(yī)了)
然后,然后,然后這個問題就解決了,他的報錯終于跳到下一步了!!!!
調(diào)換了參數(shù)位置以后,出現(xiàn)了新的報錯,說她沒有配置文件解析器,但是她這里是有配置MultipartFilte上傳文件解析器的,然后這個問題比較簡單,看了一下,解析器的id不對。應(yīng)該是:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="1048675000"/>
<property name="maxUploadSizePerFile" value="1048675000"/>
</bean>
一下午這就過去了,看了一個問題看了快2個半小時,所以必須寫個文章記錄一下。