江帅帅:精通 Spring Boot 系列 06

Spring Boot 文件的上传下载

说真的,在 Spring Boot 实现文件下载,真的是方便到让我颤抖。Java 中实现文件上传可以用两个组件:CommonMultipartResolver 和 StandardServletMultipartResolver。

Spring Boot 在 web 模块中集成了 Spring MVC ,文件上传这块儿的支持是可以通过即插即用的 MultipartResolver 实现类:CommonMultipartResolver。如果用它,则需要使用 commons-fileupload 组件来处理。

Spring Boot 提供的文件上传自动化配置类是 MultipartAutoConfiguration 中默认使用了 StandardServletMultipartResolver,在上传文件甚至能够做到零配置。

  1. 单文件上传
    1)添加 fileUpload.html 文件
    在上传页面的表单中,添加一个 type 为 file 的控件,用来选择需要上传的图片文件。上传的接口是“/upload”,另外 method 要设置为“post”,还有 enctype 要设置为“multipart/form-data”,代码具体如下:
upload

2)添加 FileUploadController 文件 首先,设置我们的文件上传路径为项目运行目录下的 upload 文件夹。然后,我们用 MultipartFile 来绑定上传的文件,使用 transferTo() 方法可以非常方便实现文件存储到磁盘当中。具体实现代码如下:

@PostMapping("/upload")
public String upload(HttpServletRequest req, MultipartFile uploadFile) {

String path = req.getSession().getServletContext().getRealPath("/upload/");
File folder = new File(path);

if (!folder.isDirectory()) {
    folder.mkdirs();
}

String oName = uploadFile.getOriginalFilename();
String nName = UUID.randomUUID().toString() + oName.substring(oName.lastIndexOf("."), oName.length());

try {
    uploadFile.transferTo(new File(folder + File.separator + nName));

    String filePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + "/upload/" + nName;

    return "ok";

} catch (IOException ex) {
    ex.printStackTrace();
}

return "error";

}
地址栏中,输入 http://localhost:8080/fileUpload.html 选择文件上传,具体运行效果如下:

在这里插入图片描述
在这里插入图片描述

  1. 采用对象方式来上传文件
    很多时候的上传操作,也都会把文件作为对象的属性进行保存,具体如何实现?下面通过注册页面,填写用户的相关信息,然后点击注册来上传 User 对象。

1)添加 fileUpload2.html 文件
通过一个表单,来收集用户的具体信息,然后点击“注册用户”按钮即可提交 /register 注册请求。代码具体如下:

用户名:

密码:

头像:

2)添加 User 类 User 类主要是用来封装用户信息的,其中 MultipartFile 类型的 pic 是用来接收上传的图像文件。

public class User {

private String username;
private String password;
private MultipartFile pic;

// getter 和 setter 方法

}
3)添加 userRegister() 方法
在 userRegister() 方法形参列表中,使用 @ModelAttribute 注解将表单提交的数据绑定到 User 对象中,其中图片会保存到 User 的 pic 属性中,然后转换为 Multipart 类型。文件上传成功之后,所有的用户信息都保存到 model 当中。

@Controller
public class FileUploadController {

@PostMapping("/register")
public String userRegister(HttpServletRequest req, @ModelAttribute User user, Model model) throws Exception {
    if (!user.getPic().isEmpty()) {

        String picPath = req.getServletContext().getRealPath("/upload/");
        String picName = user.getPic().getOriginalFilename();

        File filePath = new File(picPath, picName);

        if (!filePath.getParentFile().exists()){
            filePath.getParentFile().mkdirs();
        }

        user.getPic().transferTo(new File(picPath + File.separator + picName));

        model.addAttribute("user", user);
        return "userMsg";

    } else {
        return "error";
    }
}

}
3)在 templates 目录中,添加 userMsg.html 文件

用户名
运行效果,具体如下:

在这里插入图片描述

  1. 多文件上传
    1)添加 fileUpload2.html 页面

选第一张图片:

选第二张图片:

选第三张图片:

2)添加 uploadFiles() 方法 @PostMapping("/uploadFiles") public String uploadFiles(MultipartFile[] uploadFiles, HttpServletRequest req) {
String path = req.getSession().getServletContext().getRealPath("/upload/");
File folder = new File(path);

if (!folder.isDirectory()) {
    folder.mkdirs();
}

if (null != uploadFiles && uploadFiles.length > 0) {

    for (MultipartFile uploadFile : uploadFiles) {

        String oName = uploadFile.getOriginalFilename();
        String nName = UUID.randomUUID().toString() + oName.substring(oName.lastIndexOf("."), oName.length());

        try {

            uploadFile.transferTo(new File(folder, nName));
            return "ok";

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

return "error";

}
运行结果,具体如下:

在这里插入图片描述

  1. 文件下载
    1)编辑 userMsg.html 页面
用户名下载头像
2)添加 downloadPic() 方法 这里使用了 ResponseEntity 类型,就能定义返回的 HttpHeaders、BodyBuilder 和 HttpStatus,然后返回客户端下载。

@RequestMapping(value="/download")
public ResponseEntity<byte[]> downloadPic(HttpServletRequest request, @RequestParam(“pic”) String filename, @RequestHeader(“User-Agent”) String userAgent, Model model)throws Exception{

String path = request.getServletContext().getRealPath(
    "/upload/");

File file = new File(path + File.separator + filename);

BodyBuilder builder = ResponseEntity.ok();
builder.contentLength(file.length());
// 二进制流数据
builder.contentType(MediaType.APPLICATION_OCTET_STREAM);

// 解码
filename = URLEncoder.encode(filename, "UTF-8");

if (userAgent.indexOf("MSIE") > 0) {
    // IE
    builder.header("Content-Disposition", "attachment; filename=" + filename);
} else {
    // FireFox、Chrome
    builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename);
}
return builder.body(FileUtils.readFileToByteArray(file));

}
运行效果,具体如下:

在这里插入图片描述
免费领取更多技术资料及视频
在这里插入图片描述
本文来源于:奈学开发者社区-江帅帅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值