0


基于springboot文件上传和下载

一、文件上传介绍

1、文件上传

 文件上传,也成为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以让其它用户浏览和下载文件。在实际项目开发中文件上传是常用的,例如发微博、发朋友圈等都用到文件上传功能。

2、文件上传的前端页面介绍

  文件上传时,对于前端页面的form表单如下要求
  • method="post" 采用post方式提交数据
  • enctype="multipart/form-data" 采用multipart格式上传文件
  • type="file" 使用input的file控件上传

好消息的是现在有很多前端组件库也提供了相应的上传组件,但是底层原理还是基于from表单的文件上传。

3、文件上传的服务器代码介绍

服务器要接收客户端页面上传的文件,通常都会使用Apache的两个组件

  • commons-fileupload
  • commons-io

好消息的是在spring框架spring-web包中对文件上传进行了封装,大大简化了服务端代码,我们只需要在controller中方法中声明一个MultipartFile类型的参数即可接收上传的文件。如

@PostMapping("/XXX")
 public String upload(MultipartFile myFile)  {
     return null;
 }

4、下面都是以上传图片为例子

第一步:新建upload.html

<form method="post" action="/common/upload" enctype="multipart/form-data">
    <input name="myFile" type="file"/>
    <input type="submit" value="提交"/>
</form>

注:表单中的method必须是post;enctype属性值必须是multipart/form-data;要确保某一个input标签中的type属性值是file

第二步:编写CommonController类

package com.hq.controller;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
@RequestMapping("/common")
public class CommonTroller {
    @PostMapping("/upload")
    public String upload(MultipartFile myFile) throws IOException {
        myFile.transferTo(new File("D://hello.jpg"));
        return "sucess";
    }
}

参数myFile不是随便写的,要与<input name="myFile" type="file"/>中的name值相同

3、测试

在提交后:D盘下多了hello.jpg

5、完善上述例子

** 上面的例子,将图片保存在D://hello.jpg这种写法是固定了图片保存位置了,在实际开发中很少使用这种方式,在实际开发中常用动态的保存方式**

第一步:在application.yml(我将后缀.properties改成.yml)设值路径

upload:
  path: D:\img\

第二步:完善上面的CommonController类

package com.hq.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/common")
public class CommonTroller {
    @Value("${upload.path}")
    String basePath;
    @PostMapping("/upload")
    public String upload(MultipartFile myFile) throws IOException {
        //此时的myFile是一个临时文件,需要转到指定的位置,不然本次请求完成后临时文件会被删除

        //原始文件名(不使用原始的文件名防止文件覆盖)
        String originalFilename = myFile.getOriginalFilename();
        //获取文件名的后缀,如获取.jpg后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //使用UUID重新生成文件名,防止文件名重复造成图片覆盖
        String fileName = UUID.randomUUID().toString() + suffix;

        //如果目录是多级的,那么需要创建目录
        //创建一个目录对象
        File dir = new File(basePath);
        //判断当前目录是否存在,如果不存在那么创建该目录
        if(!dir.exists()){
            dir.mkdir();
        }
        myFile.transferTo(new File(basePath + fileName));
        return "sucess";
    }
}

第三:测试

二、文件下载

1、文件下载介绍

文件下载,也成为download,是指将文件从服务器传输到本地计算机的过程。

 通过浏览器进行文件下载,通常有两种表现形式:
  • 以附件形式下载,弹出保存对话框,将文件保存到指定磁盘目录
  • 直接在浏览器中打开(下面的例子)

通过浏览器进行文件下载,本质上就是服务器将文件以流的形式写回浏览器的过程

2、前端页面介绍

文件下载,页面端可以使用标签展示下载的图片

3、以下载图片为例

思路:页面发送请求--->服务器通过输出流将图片回显到浏览器上

这个例子的请求地址:/common/download?name=${response.data}

package com.hq.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

@RestController
@RequestMapping("/common")
public class CommonTroller {
    @Value("${upload.path}")
    String basePath;
  
    @PostMapping("/download")
    public void downLoad(String name, HttpServletResponse response){
        try {
            //输入流,通过输入流将读取文件内容
            FileInputStream fileInputStream = new FileInputStream(basePath+name);
            //输出流,通过输出流将文件回写到浏览器,在浏览器展示图片
            ServletOutputStream outputStream = response.getOutputStream();
            response.setContentType("image/jpeg");
            int len = 0;
            byte[] bytes = new byte[1024];
            while(fileInputStream.read(bytes) != -1){
                outputStream.write(bytes,0,len);
            }
            //关闭流
            fileInputStream.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注:这里的前端页面我不太懂,就没有成功的在浏览器上回显图片,但是服务器端代码流程就是上述

标签: java 开发语言

本文转载自: https://blog.csdn.net/hyt_struggle/article/details/127168991
版权归原作者 hyt_struggle 所有, 如有侵权,请联系我们删除。

“基于springboot文件上传和下载”的评论:

还没有评论