欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何解決springmvc文件下載,內容損壞的問題

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

問題描述:

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

使用場景:

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

問題原因:

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

解決辦法:

在底層服務InputStream流轉換為String前對二進制數(shù)據(jù)進行base64加密,然后再轉為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);
	}

然后上層服務調用接口獲得字符串,再進行base64解密:

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

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

下載文件代碼:

String content = (String) codeViewMap.get("content");
			
//用base64進行解碼
byte[] decodeByte = Base64.decodeBase64(content);
//將解碼的二進制文件轉換為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ù)是設置下載文件名
response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
// 設置文件ContentType類型,這樣設置,會自動判斷下載文件類型  
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()

設置響應頭

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標簽的href換了,添加了一個點擊事件,然后用js中的window.location.href就可以下載了。

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

相關文章

  • springboot啟動的注意事項之不同包下有同樣名字的class類問題

    springboot啟動的注意事項之不同包下有同樣名字的class類問題

    這篇文章主要介紹了springboot啟動的注意事項之不同包下有同樣名字的class類問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Spring 應用中集成 Apache Shiro的方法

    Spring 應用中集成 Apache Shiro的方法

    這篇文章主要介紹了Spring 應用中集成 Apache Shiro的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • SpringBoot搭建多數(shù)據(jù)源的實現(xiàn)方法

    SpringBoot搭建多數(shù)據(jù)源的實現(xiàn)方法

    說起多數(shù)據(jù)源,一般都來解決那些問題呢,主從模式或者業(yè)務比較復雜需要連接不同的分庫來支持業(yè)務。本文主要介紹了SpringBoot搭建多數(shù)據(jù)源的實現(xiàn)方法,感興趣的可以了解一下,感興趣的可以額了解一下
    2021-12-12
  • java sql ResultSet 之getRow()用法說明

    java sql ResultSet 之getRow()用法說明

    這篇文章主要介紹了java sql ResultSet 之getRow()用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java程序打印奧林匹克標志方法詳解

    Java程序打印奧林匹克標志方法詳解

    這篇文章主要介紹了Java程序打印奧林匹克標志方法詳解,需要的朋友可以參考下。
    2017-09-09
  • springboot動態(tài)注入配置與docker設置環(huán)境變量的方法

    springboot動態(tài)注入配置與docker設置環(huán)境變量的方法

    這篇文章主要介紹了springboot動態(tài)注入配置與docker設置環(huán)境變量的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 一文梳理Java?8后的新功能

    一文梳理Java?8后的新功能

    Java 8是Java自Java 5(發(fā)布于2004年)之后的最重要的版本,下面這篇文章主要給大家介紹了關于Java8后新功能的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • @Transaction,@Async在同一個類中注解失效的原因分析及解決

    @Transaction,@Async在同一個類中注解失效的原因分析及解決

    這篇文章主要介紹了@Transaction,@Async在同一個類中注解失效的原因分析及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring?MVC的完整執(zhí)行流程和常用組件詳解

    Spring?MVC的完整執(zhí)行流程和常用組件詳解

    SpringMvc是Spring的一個基于MVC開發(fā)的一個框架,用來處理前端請求,可以和Spring無縫整合,下面這篇文章主要給大家介紹了關于Spring?MVC的完整執(zhí)行流程和常用組件的相關資料,需要的朋友可以參考下
    2022-06-06
  • Spring通過ApplicationContext主動獲取bean的方法講解

    Spring通過ApplicationContext主動獲取bean的方法講解

    今天小編就為大家分享一篇關于Spring通過ApplicationContext主動獲取bean的方法講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論