Java程序部署到服務(wù)器上,接口請求下載文件失敗/文件為空/文件名不對的問題
1.問題:
昨天把項目打包放到國產(chǎn)中間件東方通(外部容器,功能類似Tomcat)上時,發(fā)現(xiàn)某些請求下載文件的接口不能正確返回文件,而是返回一個空的文件,名稱是接口名最后一個詞fj,
然而這個功能直接使用IDE啟動時沒問題的,打包放到Tomcat9上也沒問題,那可能是東方通適配問題了
2.原代碼:
部署在服務(wù)器上系統(tǒng)以后,在線打斷點,發(fā)現(xiàn)跑到這一部分就在第三行位置執(zhí)行不下去
response.setContentType('application/force-download'); response.setCharacterEncoding('utf-8'); response.setContentLengthLong(fileMetaData.getSize()); response.setHeader('Content-Disposition', 'attachment;filename=' + encodeChineseDownloadFileName(request, qualifiedFileName));
3.錯誤原因:
servlet-api.jar 版本問題,系統(tǒng)使用了新版本的方法,東方通上舊版本jar沒這個方法
4.解決
response是HttpServletResponse類型的,看一下這個類在哪:javaxservletjavax.servlet-api4.0.1javax.servlet-api-4.0.1.jar!javaxservlethttpHttpServletResponse.class
發(fā)現(xiàn)這個類是javax.servlet-api-4.0.1.jar包里的類
我在遷移系統(tǒng)到TongWeb上的時候,做了一些jar包改動,依稀記得看到過lib下使用的是servlet-api.jar
我把jar下下來,壓縮文件打開,去尋找此類,發(fā)現(xiàn)這些文件都是2012年的,說明這版東方通使用的servlet-api版本老
使用IDEA打開class,在structure中查看,發(fā)現(xiàn)我們代碼中用到的方法只有setHeader
再看一下集成的接口ServletResponse,發(fā)現(xiàn)只找到setContentType、setCharacterEncoding
看一下程序依賴的版本,好吧,新版本有這個方法
5.新代碼:
去掉這一行,接口返回正確的文件
response.setContentType('application/force-download'); response.setCharacterEncoding('utf-8'); //response.setContentLengthLong(fileMetaData.getSize()); response.setHeader('Content-Disposition', 'attachment;filename=' + encodeChineseDownloadFileName(request, qualifiedFileName));
到此這篇關(guān)于Java程序部署到服務(wù)器上,接口請求下載文件失敗/文件為空/文件名不對的文章就介紹到這了,更多相關(guān)java程序部署服務(wù)器內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
