专栏首页卯金刀GGspringboot-2-springboot的文件上传和下载

springboot-2-springboot的文件上传和下载

单文件上传

1, 需要使用thymeleaf模板: http://www.cnblogs.com/wenbronk/p/6565834.html

src/main/resource/template/file.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Hello World!</title>
    </head>
    <body>
       <form method="POST" enctype="multipart/form-data" action="/upload"> 
           <p>文件:<input type="file" name="file" /></p>
           <p><input type="submit" value="上传" /></p>
       </form>
    </body>
</html>

文件上传方法

package com.iwhere.main.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

/**
 * 文件上传controller
 * 
 * @RestController 相当于同时 @Controller和@ResponseBody两个注解
 * 
 * @author wenbronk
 * @time 2017年4月6日 下午2:43:03 2017
 */
@RestController
public class FileUploadController {

    /**
     * 文件上传
     * 
     * @return
     */
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String handlFileUpload(@RequestParam("file") MultipartFile file) {

        if (file.isEmpty()) {
            return "文件是空的";
        }

        // 读取文件内容并写入 指定目录中
        String fileName = file.getOriginalFilename();
        // String suffixName = fileName.substring(fileName.lastIndexOf("."));
        fileName = UUID.randomUUID() + "|+=|-|" + fileName;

        File dest = new File("E:/test/" + fileName);
        // 判断目录是否存在
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }

        try {
            file.transferTo(dest);
        } catch (IOException e) {
            return "后台也不知道为什么, 反正就是上传失败了";
        }
        return "上传成功";
    }
}

多文件上传:

1, thymeleaf

src/main/resource/template/multifile.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Hello World!</title>
    </head>
    <body>
       <form method="POST" enctype="multipart/form-data" action="/batch/upload"> 
           <p>文件1:<input type="file" name="file" /></p>
           <p>文件2:<input type="file" name="file" /></p>
           <p>文件3:<input type="file" name="file" /></p>
           <p><input type="submit" value="上传" /></p>
       </form>
    </body>
</html>

2, 多文件上传方法

/**
     * 多文件上传
     * 类似单文件上传, 遍历
     * @return
     */
    @RequestMapping(value = "multiUpload", method = RequestMethod.POST)
    public String handleMultiFileupload(HttpServletRequest request) {
        List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");

        for (MultipartFile multipartFile : files) {
            if (multipartFile.isEmpty()) {
                return "文件是空的";
            }

            // 读取文件内容并写入 指定目录中
            String fileName = multipartFile.getOriginalFilename();
            // String suffixName =
            // fileName.substring(fileName.lastIndexOf("."));
            fileName = UUID.randomUUID() + "|+=|-|" + fileName;

            File dest = new File("E:/test/" + fileName);
            // 判断目录是否存在
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }

            try {
                multipartFile.transferTo(dest);
            } catch (IOException e) {
                return "后台也不知道为什么, 反正就是上传失败了";
            }
        }
        return "上传成功";
    }

文件下载

/**
     * 文件下载
     * 
     * @return
     */
    @RequestMapping("/download")
    public String downLoadFile(HttpServletRequest request, HttpServletResponse response) {
        // 文件名可以从request中获取, 这儿为方便, 写死了
        String fileName = "rtsch_ex.json";
        // String path = request.getServletContext().getRealPath("/");
        String path = "E:/test";
        File file = new File(path, fileName);

        if (file.exists()) {
            // 设置强制下载打开
            response.setContentType("application/force-download");
            // 文件名乱码, 使用new String() 进行反编码
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);

            // 读取文件
            BufferedInputStream bi = null;
            try {
                byte[] buffer = new byte[1024];
                bi = new BufferedInputStream(new FileInputStream(new File("")));
                ServletOutputStream outputStream = response.getOutputStream();
                int i = -1;
                while (-1 != (i = bi.read(buffer))) {
                    outputStream.write(buffer, 0, i);
                }
                return "下载成功";
            } catch (Exception e) {
                return "程序猿真不知道为什么, 反正就是下载失败了";
            } finally {
                if (bi != null) {
                    try {
                        bi.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return "文件不存在";
    }

文件下载时, 最容易出现文件名乱码的问题, 这儿使用new String() 进行反编码,

String downname = new String(filename.getBytes("gbk"),"iso8859-1");

当然还有个不太稳的方法:

URLEncoder.encode(fileName, "UTF-8"));

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【HttpClientUtil完整的工具类】

    用户5640963
  • SpringMVC+redis整合

    在网络上有一个很多人转载的springmvc+redis整合的案例,不过一直不完整,也是被各种人装来转去,现在基本将该框架搭建起来。

    用户5640963
  • ZooKeeper学习第三期---Zookeeper命令操作

    Zookeeper支持某些特定的四字命令字母与其的交互。他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息。用户在客户端可以通过telne...

    用户5640963
  • Android开发笔记(二十五)assets目录下的文件读取

    assets目录用于存放应用程序的资产文件,该目录下的文件不会被系统编译,所以无法通过R.*.*这种方式来访问。Android专门为assets目录提供了一...

    用户4464237
  • 使用hive客户端java api读写hive集群上的信息

    上文介绍了hdfs集群信息的读取方式,本文说hive 1、先解决依赖 <properties> <hive.version>1.2.1</hiv...

    用户1225216
  • 「小程序JAVA实战」小程序头像图片上传(上)(43)

    PS:基本头像上传已经完毕,主要是springboot和小微信API的使用。对于用户表中的头像更新和交互式弹框,我后来都在源码上做了升级。建议观看源码。

    IT故事会
  • Android开发笔记(三十三)文本文件和图片文件的读写

    简单文件读写一般是借助于FileOutputStream和FileInputStream,其中FileOutputStream用于写文件,而FileInpu...

    用户4464237
  • 隐马尔可夫模型攻略

    隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然...

    机器学习AI算法工程
  • python开发_python文件操作

    官方API:os-Miscellaneous operating system interfaces

    Hongten
  • 【机器学习研究】隐马尔可夫模型 (HMM) 最认真研究

    隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然...

    量化投资与机器学习微信公众号

扫码关注云+社区

领取腾讯云代金券