解决Spring文件下载时文件损毁问题

本文介绍了如何使用Spring MVC实现文件下载功能,并解决了下载过程中可能出现的文件名乱码及文件损毁等问题。通过配置ByteArrayHttpMessageConverter类的位置,可以确保文件正确下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值