解決Spring檔案下載時檔案損毀問題
阿新 • • 發佈:2019-01-05
首先,spring檔案下載的程式碼如下:
/** * 檔案下載 * @return * @throws IOException */ @RequestMapping(value="/download") public ResponseEntity<byte[]> download(String filename)throws Exception { // 獲取下載檔案路徑 String path = request.getServletContext().getRealPath("/uploads/"); // 獲取下載檔案 File file = new File(path + File.separator + filename); // 解決檔案下載時中文檔名亂碼 String downloadFielName = new String(filename.getBytes("UTF-8"),"iso-8859-1"); // 設定頭資訊 HttpHeaders headers = new HttpHeaders(); // 設定瀏覽器以attachment(下載方式) headers.setContentDispositionFormData("attachment", downloadFielName); // application/octet-stream : 二進位制流資料 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); }
解決下載檔案損毀問題:
下載下來的檔案會出現亂碼或者檔案內容損壞的情況,解決辦法如下:
在springmvc配置檔案中,配置ByteArrayHttpMessageConverter類:
<bean id="arrayHttpMessageConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
引入該類時,該類要在StringHttpMessageConverter類和MappingJackson2HttpMessageConverter類之前;
完整配置為:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 開啟控制反轉註解的支援 --> <context:component-scan base-package="com.soft863" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 開啟mvc註解的支援 --> <mvc:annotation-driven> <mvc:message-converters> <!-- arrayHttpMessageConverter要放在後面兩個之前 --> <ref bean="arrayHttpMessageConverter" /> <ref bean="stringHttpMessageConverter" /> <ref bean="mappingJackson2HttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven> <!-- 配置Spring檢視解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- 檔案上傳解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8"></property> <property name="maxUploadSize" value="999999999"></property> </bean> <!-- spring檔案下載 --> <bean id="arrayHttpMessageConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> <!-- 解決中文亂碼:該類解決當返回的資料是字串包含中文時出現亂碼問題 --> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=utf-8</value> </list> </property> </bean> <!-- 解決IE低版本下載返回json資料 --> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=utf-8</value> <value>application/json;charset=utf-8</value> </list> </property> </bean> <!-- 解決靜態資源攔截問題 --> <mvc:default-servlet-handler /> </beans>