記錄關於Cause為Stream Closed的FileUploadException


今天在寫上傳頭像和圖片模塊時,再加上自己的權限攔截器時,在無權限時會拋出異常:

WARN 2018-05-08 20:27:14,198 [http-apr-8080-exec-7] org.springframework.web.multipart.commons.CommonsMultipartResolver: - Failed to perform multipart cleanup for servlet request
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream closed

看了看異常描述,大致是CommonsMultipartResolver無法完成清理(cleanup)工作,於是尋找CommonsMultipartResolver中的方法,發現有一個cleanupMultipart()方法,該方法描述如下:

public void cleanupMultipart(MultipartHttpServletRequest request) {
    if (request != null) {
        try {
            cleanupFileItems(request.getMultiFileMap());
        }
        catch (Throwable ex) {
            logger.warn("Failed to perform multipart cleanup for servlet request", ex);
        }
    }
}        

繼續追查異常原因,發現是在調用getMultiFileMap()拋出的,其中,當multipartfile變量為null時,會開始一個初始化的動作,這里會調用parseRequest()這個方法,在debug模式下發現request的inputstream是closed的,於是返回我的權限攔截器,在反復發送請求,發現我的工具類WebDataUtils里的writeJson里有這么一段代碼:

try {
writer
= response.getWriter(); writer.write(JSON.toJSONString(resultMap)); } finally { if(writer != null) { writer.close(); } }

這是在發生IOException時,關閉流的正常操作,但沒想到調用了writer的close時,因為response里有一個request的引用,requset的inputstream也一同關閉了,所以導致后面CommonsMultipartResolver清理時發生了Stream closed的異常。於是在權限攔截器中加入了判斷請求是否是multipart請求,如果是,則不關閉流,最后交給CommonsMultipartResolver清理,最終解決了該異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM