最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何解決springmvc文件下載,內(nèi)容損壞的問題

 更新時間:2021年06月17日 12:06:32   作者:格子間里格子衫  
這篇文章主要介紹了解決springmvc文件下載,內(nèi)容損壞的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

問題描述:

java 中inputstream流 轉(zhuǎn)成string,再將String轉(zhuǎn)換會inputStream,下載下來的文件,內(nèi)容損壞,例如下載word文檔

使用場景:

底層服務(wù)讀取到文件內(nèi)容獲得InputStream,因為需要多次接口調(diào)用,為了便于數(shù)據(jù)傳遞,將InputStream轉(zhuǎn)換為String字符串進行傳遞,上層服務(wù)調(diào)用接口,獲取String字符串,在轉(zhuǎn)換成InputStream進行IO的讀寫操作;

問題原因:

如果文件內(nèi)容是字符型,這種方法沒有問題,如果不是字符型的,比如MP3,圖片,word文檔等,下載下來會無法打開,如上圖;

解決辦法:

在底層服務(wù)InputStream流轉(zhuǎn)換為String前對二進制數(shù)據(jù)進行base64加密,然后再轉(zhuǎn)為String字符串:

public String inputStream2String(InputStream in) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int len = 0;
        byte[] b = new byte[1024];	
        while ((len = in.read(b, 0, b.length)) != -1) {                     
            baos.write(b, 0, len);
        }
        byte[] buffer =  baos.toByteArray();
        //base64加密
        return Base64.encodeBase64String(buffer);
	}

然后上層服務(wù)調(diào)用接口獲得字符串,再進行base64解密:

Map<String, Object> reMap = gitCodeViewService.gitCodeView(Id, path, version);
String content = (String) reMap.get("content");
			
//用base64進行解碼
byte[] decodeByte = Base64.decodeBase64(content);
//將解碼的二進制文件轉(zhuǎn)換為inputStream
InputStream is = new ByteArrayInputStream(decodeByte);

在使用InputStream進行IO的讀寫操作,下載文件內(nèi)容就正常了。

下載文件代碼:

String content = (String) codeViewMap.get("content");
			
//用base64進行解碼
byte[] decodeByte = Base64.decodeBase64(content);
//將解碼的二進制文件轉(zhuǎn)換為inputStream
InputStream is = new ByteArrayInputStream(decodeByte);
			
String userAgent = request.getHeader("User-Agent");
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {  
    //IE瀏覽器處理
    fileName = java.net.URLEncoder.encode(fileName, "UTF-8");  
    } else {  
    // 非IE瀏覽器的處理:  
    fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");  
   } 
			
// 設(shè)置文件頭:最后一個參數(shù)是設(shè)置下載文件名
response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
// 設(shè)置文件ContentType類型,這樣設(shè)置,會自動判斷下載文件類型  
response.setContentType("application/octet-stream");
OutputStream os = response.getOutputStream();
// 輸入流輸出流對拷
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b)) > 0) {
	os.write(b, 0, len);
}
os.close();
is.close();

springmvc下載文件遇到的坑

java上傳文件不難,思路也比較清晰,利用SpringMVC就更簡單了。

獲取要下載的文件

InputStream in = new FileInputStream(path);

得到輸出流

response.getOutputStream()

設(shè)置響應(yīng)頭

response.setContentType("application/force-download");
response.setHeader("content-disposition","attachment;filename="+filename);

老套路,拷貝數(shù)據(jù)

int len = 0;
byte[] b = new byte[1024];
while((len=in.read(b))!=-1){
    out.write(b,0,len);
}

但是這次我下載文件的時候,寫的沒問題,但是就是一直不能下載,每次都是在頁面輸出了二級制流。

也就是得到一片亂碼。找了半天,也沒找到哪里錯了。

后來把a標(biāo)簽的href換了,添加了一個點擊事件,然后用js中的window.location.href就可以下載了。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解讀@ResponseBody與@RequestBody注解的用法

    解讀@ResponseBody與@RequestBody注解的用法

    這篇文章主要介紹了Spring MVC中的@ResponseBody和@RequestBody注解的用法,@ResponseBody注解用于將Controller方法的返回對象轉(zhuǎn)換為指定格式(如JSON)并通過Response響應(yīng)給客戶端,@RequestBody注解用于讀取HTTP請求的內(nèi)容
    2024-11-11
  • java 字浮串提取方法匯集

    java 字浮串提取方法匯集

    用方法toCharArray public char[] toCharArray()
    2008-10-10
  • EL調(diào)用Java方法_動力節(jié)點Java學(xué)院整理

    EL調(diào)用Java方法_動力節(jié)點Java學(xué)院整理

    簡單來說,我們在一個類中的某個方法,可以使用EL進行調(diào)用,這個能被EL表達式調(diào)用的方法稱之為EL函數(shù),但是這種方式必須滿足兩點要求,具體哪兩點,大家可以參考下本文
    2017-07-07
  • 淺談Springboot之于Spring的優(yōu)勢

    淺談Springboot之于Spring的優(yōu)勢

    這篇文章主要介紹了淺談Springboot之于Spring的優(yōu)勢,簡述了在Java EE開發(fā)中遇到的問題,言簡意賅,需要的朋友可以參考下。
    2017-09-09
  • Java8中Optional的一些常見錯誤用法總結(jié)

    Java8中Optional的一些常見錯誤用法總結(jié)

    我們知道 Java 8 增加了一些很有用的 API, 其中一個就是 Optional,下面這篇文章主要給大家介紹了關(guān)于Java8中Optional的一些常見錯誤用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • maven安裝jar包到本地的操作方法

    maven安裝jar包到本地的操作方法

    這篇文章主要介紹了maven安裝jar包到本地,執(zhí)行該命令后,Maven?會將該?JAR?文件安裝到你本地?Maven?倉庫中,需要的朋友可以參考下
    2007-01-01
  • Java中的@PreAuthorize注解源碼解析

    Java中的@PreAuthorize注解源碼解析

    這篇文章主要介紹了Java中的@PreAuthorize注解源碼解析,@PreAuthorize注解會在方法執(zhí)行前進行權(quán)限驗證,支持Spring?EL表達式,它是基于方法注解的權(quán)限解決方案,需要的朋友可以參考下
    2023-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)常見幾大排序梳理

    Java數(shù)據(jù)結(jié)構(gòu)常見幾大排序梳理

    Java常見的排序算法有:直接插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序等。本文詳解介紹它們的實現(xiàn)以及圖解,需要的可以參考一下
    2022-03-03
  • Java如何設(shè)置系統(tǒng)參數(shù)和運行參數(shù)

    Java如何設(shè)置系統(tǒng)參數(shù)和運行參數(shù)

    這篇文章主要介紹了Java如何設(shè)置系統(tǒng)參數(shù)和運行參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • MongoDB整合Spring實例詳細講解(含代碼)

    MongoDB整合Spring實例詳細講解(含代碼)

    這篇文章主要介紹了MongoDB整合Spring實例詳細講解(含代碼),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論

新营市| 汤原县| 永宁县| 襄汾县| 徐闻县| 大邑县| 中山市| 台南县| 武功县| 即墨市| 阳东县| 宜丰县| 兰溪市| 河曲县| 武功县| 邓州市| 沙湾县| 温泉县| 都兰县| 河曲县| 荆州市| 石屏县| 搜索| 银川市| 浦城县| 周至县| 晋江市| 鹿泉市| 娄底市| 延吉市| 西充县| 苍溪县| 灵山县| 乐昌市| 白城市| 新绛县| 怀仁县| 务川| 大竹县| 枣阳市| 手游|