簡單來說就是spring上傳的io流上傳。
我前端用的angularjs 的一個上傳文件的插件,同時顯示上傳的進度,發現當進度是100%的時候后台才開始工作,然而老板也要求用io流傳輸,便開始瘋狂的 百度 bing,都沒找到原因。寫了個serclet的demo發現這是spring 的問題,就想到了
spring 的一個bean:
<bean id="multipartResolver"
class="com.shinewonder.oneshot.util.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>
當時上傳圖片用的這個bean.我把這個注釋后,后台會立即響應,但是上傳圖片的controller會報錯。
當你配置了這個bean上傳文件時spring 會封裝request,spring會先緩存文件,然后才會訪問你的controller。
上網查的是重寫CommonsMultipartResolver但是他是為了解決自己封裝的request,但是思路是一樣的,於是我查看了源碼,發現控制spring封裝的是isMultipart()於是我重寫了這個方法,在里面過濾了我要io流上傳的文件:
public class CommonsMultipartResolver extends org.springframework.web.multipart.commons.CommonsMultipartResolver {
@Override
public boolean isMultipart(HttpServletRequest request) {
if(request.getRequestURI().indexOf("需要過濾的url")>=0)
return false;
else return request != null && ServletFileUpload.isMultipartContent(request);
}
}
后台就是用的request來獲取io流,處理文件
