国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索

這篇具有很好參考價(jià)值的文章主要介紹了MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、描述異常背景:

因?yàn)樾枰治鰯?shù)據(jù),待處理excel文件的數(shù)據(jù)行數(shù)太大,手動(dòng)太累,花半小時(shí)寫(xiě)了一個(gè)定制的數(shù)據(jù)入庫(kù)工具,改成了通用的,整個(gè)項(xiàng)目中的萬(wàn)級(jí)別數(shù)據(jù)都在工具上分析,寫(xiě)SQL進(jìn)行分析,但是遇到很疑惑的問(wèn)題,文件上傳結(jié)束收流時(shí),tomcat的DisFileItem類的delete方法會(huì)自動(dòng)調(diào)用,但是如果當(dāng)前系統(tǒng)用戶的權(quán)限不足,或是文件流在刪除該臨時(shí)文件之前未關(guān)閉都會(huì)導(dǎo)致刪除失敗,雖然接收流的業(yè)務(wù)操作都結(jié)束了,但是很是會(huì)報(bào)出糟心的UncheckedIOException:Cannot delete? tomcat默認(rèn)的臨時(shí)文件路徑+_00000000.tmp異常(劇透一下:運(yùn)行時(shí)未關(guān)閉輸入流,JVM還在等待用戶關(guān)閉,存在引用無(wú)法回收,所以手動(dòng)跟著路徑去刪除你都刪不掉,所以跟著源碼找根源)。

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

2、查找異常原因(并不是所有的異常都是你顯式的寫(xiě)出來(lái)的,特別是輪子使用不仔細(xì)的內(nèi)部異常)

?以上請(qǐng)及其注意異常出現(xiàn)的根源:StandardServletMultipartResolver.java:134;

我們進(jìn)去查看其源碼得到

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

?也就是說(shuō)我們的請(qǐng)求文件接收成功了嗎,但是刪除臨時(shí)文件的操作出現(xiàn)問(wèn)題了:

if (request.getFile(part.getName()) != null) {
                        part.delete();
   }

進(jìn)入刪除的代碼下來(lái):

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

注意這一句源碼注釋:

?刪除部件的基礎(chǔ)存儲(chǔ),包括刪除任何關(guān)聯(lián)的臨時(shí)磁盤(pán)文件。盡管容器將自動(dòng)刪除此存儲(chǔ),但此方法可用于確保在較早的時(shí)間執(zhí)行此操作,從而保留系統(tǒng)資源。
僅當(dāng)對(duì)部件實(shí)例進(jìn)行垃圾回收時(shí),才需要容器刪除關(guān)聯(lián)的存儲(chǔ)。Apache Tomcat 將在關(guān)聯(lián)的請(qǐng)求完成處理后刪除關(guān)聯(lián)的存儲(chǔ)。其他容器的行為可能不同。
拋出:
IOException – 如果在嘗試刪除部件時(shí)發(fā)生 I/O

那么我們進(jìn)入到它的默認(rèn)實(shí)現(xiàn)類的最終源碼:

?MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

?到這里我們大致是知道問(wèn)題出在這個(gè)臨時(shí)文件的刪除上了。

?但是為什么刪除失敗呢?只有可能是這行代碼的問(wèn)題:

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

?如果輸出的文件就是有問(wèn)題的null那一定是刪除不掉的,讓我們找找源碼:

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

?這里一定是沒(méi)有問(wèn)題的,繼續(xù)往下走:

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

?由此處的信息可以知道作為緩沖的臨時(shí)文件區(qū)域的輸出流未完成,還在保持開(kāi)啟狀態(tài),很大的可能是緩沖前的輸入的流還沒(méi)完全關(guān)閉(我們明確知道的是在代碼里獲取了輸入的流但是沒(méi)有對(duì)流進(jìn)行關(guān)閉),亦或有可能原本文件上傳就是null(當(dāng)然不可能了兄弟)

3、結(jié)合2查找真正導(dǎo)致輸出文件流在刪除之前關(guān)閉的原因

我們注意到簡(jiǎn)單的接口代碼是:

    @PostMapping("/upTopGoods")
    @ResponseBody
    public void upTopGoods(@RequestParam("fileName") MultipartFile fileName){
        if (Objects.nonNull(fileName)){
            excelUtil.setTopGoods(fileName);
        }
    }

這個(gè)流會(huì)在操作完成或輸入流的字節(jié)被處理完之后沒(méi)能主動(dòng)關(guān)閉的話,很有可能出自于接口MultipartFile的性質(zhì)需要我們自己關(guān)閉(所以才會(huì)有一次OOM異常,但是請(qǐng)注意一定不僅僅是這個(gè)導(dǎo)致的,BUG選手程序員要保持疑問(wèn))。

所以我們查看MultipartFile的源碼試圖找出問(wèn)題所在:

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

?以上是MultipartFile的輸入流方法注釋。

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

以上處理完數(shù)據(jù)之后我們對(duì)輸入的流進(jìn)行了關(guān)閉,測(cè)試一下看看是否解決了問(wèn)題:

MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

?MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索,tomcat,java

?通過(guò)結(jié)果來(lái)看是完全沒(méi)有問(wèn)題的了。

本次排查問(wèn)題尋根原理過(guò)程結(jié)束,拜拜!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-615921.html

到了這里,關(guān)于MultipartFile類型接收上傳文件報(bào)出的UncheckedIOException以及刪除tomcat臨時(shí)文件失敗源碼探索的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Postman本地測(cè)試上傳MultipartFile文件接口

    Postman本地測(cè)試上傳MultipartFile文件接口

    在請(qǐng)求Body中選擇form-data傳輸類型,填寫(xiě)后端file參數(shù)名稱,并將參數(shù)設(shè)置為File類型,這時(shí)value輸入框?qū)⒆兂晌募x擇框。 如果此時(shí)發(fā)送請(qǐng)求給后端,會(huì)返回報(bào)錯(cuò)request is not a multipart request. 我們還需要將數(shù)據(jù)傳輸類型Content-Type設(shè)置為multipart/form-data.

    2024年02月12日
    瀏覽(23)
  • 基于SpringWeb MultipartFile文件上傳、下載功能

    在Web開(kāi)發(fā)中,文件上傳是一個(gè)常見(jiàn)的功能需求。Spring框架提供了MultipartFile接口,用于處理文件上傳請(qǐng)求。MultipartFile可以代表一個(gè)多部分文件上傳請(qǐng)求中的一個(gè)文件,提供了一系列方法用于獲取文件的各種屬性和內(nèi)容,使得在后端處理文件上傳變得十分方便。下面我們將介紹

    2024年04月17日
    瀏覽(29)
  • Spring Mvc 文件上傳(MultipartFile )—官方原版

    要啟動(dòng)Spring Boot MVC應(yīng)用程序,首先需要一個(gè)啟動(dòng)器。在這個(gè)示例中,已經(jīng)添加了spring-boot-starter thymelaf和spring-boot-starter web作為依賴項(xiàng)。要使用Servlet容器上傳文件,您需要注冊(cè)一個(gè)MultipartConfigElement類(在web.xml中為<multipart-config>)。多虧了Spring Boot,一切都可以自動(dòng)配置!

    2024年02月14日
    瀏覽(18)
  • MultipartFile上傳至服務(wù)器,文件名稱中文亂碼問(wèn)題

    MultipartFile上傳至服務(wù)器,文件名稱中文亂碼問(wèn)題

    1.首先查看服務(wù)器是否設(shè)置為了zh_CN.UTF-8 輸入命令:locale ?不是則,進(jìn)行查看服務(wù)器上是否有zh_CN.UTF-8 查看所有可以使用的字符編碼集 輸入命令:locale -a ?如果沒(méi)有可用的zh_CN.UTF-8 則進(jìn)行安裝: CentOS命令:yum install kde-l10n-Chinese -y? ubuntu命令:sudo apt-get install language-pack-zh-ha

    2024年02月10日
    瀏覽(26)
  • SpringBoot如何使用MultipartFile進(jìn)行文件上傳保存到服務(wù)器本地

    之前一直都是用的別人封裝好的文件上傳方法,這次想自己寫(xiě)一個(gè)特別簡(jiǎn)單的,文件上傳方法,非常適合新手觀看… 首先需要Springboot需要有Web依賴,就是下面這個(gè)依賴 依賴導(dǎo)完了,下面就直接是代碼,大家看一下 到這里文件上傳的解釋都在代碼里面,下面如果報(bào)文件過(guò)大的報(bào)錯(cuò)還需

    2024年02月13日
    瀏覽(31)
  • Spring Boot學(xué)習(xí)隨筆- 文件上傳和下載(在線打開(kāi)、附件下載、MultipartFile)

    Spring Boot學(xué)習(xí)隨筆- 文件上傳和下載(在線打開(kāi)、附件下載、MultipartFile)

    學(xué)習(xí)視頻:【編程不良人】2021年SpringBoot最新最全教程 文件上傳是指將文件從客戶端計(jì)算機(jī)傳輸?shù)椒?wù)器的過(guò)程。 上傳思路 前端的上傳頁(yè)面:提交方式必須為 post , enctype 屬性必須為 multipart/form-data 開(kāi)發(fā)后端的Controller 后端方法接收參數(shù)必須和前端標(biāo)簽的name名一致 upload.js

    2024年02月04日
    瀏覽(51)
  • java MultipartFile+vue+element 批量上傳文件、圖片,與普通數(shù)據(jù)同時(shí)提交保存才上傳到后端

    java MultipartFile+vue+element 批量上傳文件、圖片,與普通數(shù)據(jù)同時(shí)提交保存才上傳到后端

    文件上傳項(xiàng)目可參考:點(diǎn)擊預(yù)覽 1.最簡(jiǎn)單也是最普遍的做法是form表單提交,其實(shí)前端提交到后端也是難以離開(kāi)form表單提交, 一般有兩種方式來(lái)處理文件、圖片上傳: 先上傳,獲取返回路徑,再整個(gè)表單提交后端保存; 普通數(shù)據(jù)與文件圖片同時(shí)提交后端,由后端處理 優(yōu)點(diǎn)比

    2024年02月03日
    瀏覽(20)
  • Spring Cloud Feign MultipartFile文件上傳踩坑之路(包含前端文件上傳請(qǐng)求、后端文件保存到aliyun-oss文件服務(wù)器)

    Spring Cloud Feign MultipartFile文件上傳踩坑之路(包含前端文件上傳請(qǐng)求、后端文件保存到aliyun-oss文件服務(wù)器)

    文件上傳組件用的是ant-design的a-upload組件,我的界面如下所示: 文件上傳請(qǐng)求API: FileUtils.js 需要注意的只有FileUtils.js定義的uploadApi請(qǐng)求函數(shù),其中 URL 為后端請(qǐng)求接口(“/imageConvert/upload”),文件上傳方法必須定義為 POST ,在 headers 加入’Content-type’: ‘multipart/form-data’,后端

    2024年02月12日
    瀏覽(21)
  • SpringBoot文件上傳同時(shí),接收復(fù)雜參數(shù)

    SpringBoot文件上傳同時(shí),接收復(fù)雜參數(shù)

    目錄 環(huán)境信息 問(wèn)題描述 錯(cuò)誤分析 解決方法 簡(jiǎn)單參數(shù) 總結(jié) ????????Spring Boot:2.0.8.RELEASE ????????Spring Boot內(nèi)置的tomcat:tomcat-embed-core 8.5.37 ? ? ? ? 收到文件上傳的開(kāi)發(fā)工作,要求能適配各種場(chǎng)景,并且各場(chǎng)景的請(qǐng)求參數(shù)不一樣,因此接收的參數(shù)不能是固定的幾個(gè)字段

    2024年02月09日
    瀏覽(18)
  • SpringBoot后端接收Axios上傳的文件

    SpringBoot后端接收Axios上傳的文件

    很多時(shí)候,我們項(xiàng)目開(kāi)發(fā)的過(guò)程中,難免會(huì)遇到文件上傳的需求 對(duì)于 SpringBoot 項(xiàng)目,我們?cè)撊绾尉帉?xiě)一個(gè)文件上傳的接口呢? 這里我用的是 阿里云OSS 云服務(wù)器來(lái)作為上傳文件的存儲(chǔ)倉(cāng)庫(kù),比起存儲(chǔ)在電腦本地,云服務(wù)器更加便于管理、性能更好并且更加 安全 ,值得我們選

    2024年02月22日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包