SpringMvc文件上传 / 下载

该博客介绍了如何使用Spring MVC处理文件上传和下载。在前端,通过HTML表单和POST请求实现文件选择和提交。在后端,依赖于`commons-fileupload`库,文件上传后会被封装为`CommonsMultipartFile`对象,并存储到指定路径。文件下载部分展示了如何通过I/O流实现文件的下载,同时处理文件名编码问题。还提到了@RestController返回Json乱码的配置解决方法。

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

1.前端

<form action="${pageContext.request.contextPath}/upload" method="post"             
enctype="multipart/form-data">
    <input type="file" name="image">
    <input type="submit" value="上传"/>
</form>

 2.依赖 

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>

  3.文件上传的两种方式:

        1.基于I/O流读入写出

        2.文件上传后被封装在CommonsMultipartFile对象file中,从file获取文件名,创建存储路径,使用TransferTo(parent,child)直接转存文件。parent指父路径,child指要存储的文件。

@Controller
public class FileController {

    @ResponseBody
    @RequestMapping("/test")
    public String test(){
        return "成功";
    }

    @RequestMapping("/upload")//将name等于file的控件得到的文件封装成CommonsMultipartFile对象
    public String upload(@RequestParam("image") CommonsMultipartFile file, HttpServletRequest request) {
        String filename = file.getOriginalFilename();
        if("".equals(filename)){
            return "redirect:index.jsp";
        }
        filename  = UUID.randomUUID().toString().substring(0, 12) + "_" + filename;
        //设置上传文件保存位置
        String path = request.getSession().getServletContext().getRealPath("/upload/images");
        //如果路径不存在,创建一个,防止报错
        File realpath = new File(path);
        if(!realpath.exists()){
            realpath.mkdirs();
        }
        try {
            file.transferTo(new File(realpath,filename));
        } catch (IOException e) {
            e.printStackTrace();
        }
        /*
        //文件输入流
        InputStream in = null;
        OutputStream out = null;

        try {
            in = file.getInputStream();
            out = new FileOutputStream(new File(realpath,filename));

            //读取写出
            int len;
            byte[] buffer = new byte[1024];
            while((len = in.read(buffer)) != -1){
                out.write(buffer,0,len);
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
            return "上传失败";
        }finally {
            try {
                assert out != null;
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
*/
        return "上传成功!";
    }
}

  4.文件下载

        基于I/O流实现文件的下载

@ResponseBody
    @RequestMapping("/download")
    public String download(HttpServletRequest request,HttpServletResponse response){
        String path = request.getSession().getServletContext().getRealPath("/upload/images");
        String filename = "c6d6b06f-493_1.jpg";

        response.reset();
        response.setCharacterEncoding("UTF-8");
        response.setContentType("multipart/form-data");
        try {
            response.setHeader("Content-Disposition","attachment;fileName=" + URLEncoder.encode(filename,"utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "下载失败";
        }

        File file = new File(path,filename);
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(file);
            out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while((len = in.read(buffer)) != -1){
                out.write(buffer,0,len);
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
            return "下载失败";
        }finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "下载成功";
    }

 使用@RestController返回Json乱码配置

<!--json乱码配置-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg name="defaultCharset" value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值