Rumah  >  Artikel  >  Java  >  Bagaimana SpringBoot melaksanakan fungsi muat naik dan muat turun fail

Bagaimana SpringBoot melaksanakan fungsi muat naik dan muat turun fail

WBOY
WBOYke hadapan
2023-05-16 08:46:121337semak imbas

Muat naik dan muat turun fail Spring Boot

Dalam pembangunan aplikasi web sebenar, untuk berjaya memuat naik fail, kaedah borang mesti ditetapkan untuk dipos dan enctype mesti ditetapkan kepada multipart/form-data . Hanya dengan tetapan ini penyemak imbas boleh menghantar data binari fail yang dipilih ke pelayan.

Bermula dari Servlet 3.0, kaedah untuk mengendalikan muat naik fail telah disediakan, tetapi muat naik fail ini perlu dilengkapkan dalam Java Servlet, dan Spring MVC menyediakan enkapsulasi yang lebih mudah. Spring MVC melaksanakan kelas pelaksanaan MultipartResolver CommonsMultipartResolver melalui teknologi Apache Commons FileUpload untuk melengkapkan muat naik fail. Oleh itu, muat naik fail Spring MVC perlu bergantung pada komponen Muat Naik Fail Apache Commons.

Spring MVC secara automatik mengikat fail yang dimuat naik ke objek MultipartFile menyediakan kaedah untuk mendapatkan kandungan fail yang dimuat naik, nama fail, dsb., dan memuat naik fail ke cakera pelayan melalui kaedah transferTo MultipartFile adalah seperti berikut :

  • bait[] getBytes(): Dapatkan data fail.

  • String getContentType(): Dapatkan fail jenis MIME, seperti imej/jpeg, dsb.

  • InputStream getInputStream(): Dapatkan strim fail.

  • String getName(): Dapatkan nama komponen fail dalam borang.

  • String getOriginalFilename(): Dapatkan nama asal fail yang dimuat naik.

  • long getSize(): Dapatkan saiz bait fail, dalam bait.

  • boolean isEmpty(): Sama ada terdapat fail muat naik (dipilih).

  • void transferTo(File dest): Simpan fail yang dimuat naik ke fail sasaran.

Spring Boot's spring-boot-starter-web telah menyepadukan Spring MVC, jadi lebih mudah untuk menggunakan Spring Boot untuk memuat naik fail Anda hanya perlu memperkenalkan pergantungan komponen Apache Commons FileUpload .

Contoh

Yang berikut menggunakan contoh untuk menerangkan proses pelaksanaan muat naik dan muat turun fail Spring Boot.

[Contoh 7] Muat naik dan muat turun fail Spring Boot.

Langkah pelaksanaan khusus adalah seperti berikut.

1. Perkenalkan kebergantungan komponen Apache Commons FileUpload

Dalam fail pom.xml aplikasi web ch7_2, tambahkan kebergantungan komponen Apache Commons FileUpload Kod khusus adalah seperti berikut:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <!-- 由于commons-fileupload组件不属于Spring Boot,所以需要加上版本 -->
    <version>1.4</version>
</dependency>

2 .Tetapkan had saiz fail muat naik

Dalam aplikasi fail konfigurasi.properties aplikasi web ch7_2, tambahkan konfigurasi berikut untuk mengehadkan saiz fail muat naik.

#上传文件时,默认单个上传文件大小是1MB,max-file-size设置单个上传文件大小
spring.servlet.multipart.max-file-size=50MB
#默认总文件大小是10MB,max-request-size设置总上传文件大小
spring.servlet.multipart.max-request-size=500MB

3. Cipta halaman paparan pemilihan fail

Dalam direktori src/main/resources/templates aplikasi ch7_2, buat halaman paparan pemilihan fail uploadFile.html. Terdapat borang borang dalam halaman ini dengan nilai atribut enctype multipart/form-data Kod khusus adalah seperti berikut:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" />
<!-- 默认访问 src/main/resources/static下的css文件夹-->
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" />
</head>
<body>
<div class="panel panel-primary">
    <div class="panel-heading">
      <h4 class="panel-title">文件上传示例</h4>
    </div>
  </div>
  <div class="container">
    <div class="row">
      <div class="col-md-6 col-sm-6">
        <form class="form-horizontal" action="upload" 
method="post" enctype="multipart/form-data">
          <div class="form-group">
            <div class="input-group col-md-6">
              <span class="input-group-addon">
                <i class="glyphicon glyphicon-pencil"></i>
              </span>
              <input class="form-control" type="text"
               name="description" th:placeholder="文件描述"/>
            </div>
          </div>
          <div class="form-group">
            <div class="input-group col-md-6">
              <span class="input-group-addon">
                <i class="glyphicon glyphicon-search"></i>
              </span>
              <input class="form-control" type="file"
               name="myfile" th:placeholder="请选择文件"/>
            </div>
          </div>
          <div class="form-group">
            <div class="col-md-6">
              <div class="btn-group btn-group-justified">
                <div class="btn-group">
                  <button type="submit" class="btn btn-success">
                    <span class="glyphicon glyphicon-share"></span>
                     上传文件
                  </button>
                </div>
              </div>
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>
</body>
</html>

4 Cipta pengawal

dalam com.ch.ch7_2 digunakan dalam ch7_2 Dalam pakej pengawal, buat kelas pengawal TestFileUpload. Terdapat 4 kaedah pemprosesan dalam kelas ini, satu kaedah navigasi antara muka uploadFile, satu kaedah muat naik yang melaksanakan muat naik fail, satu kaedah showDownLoad yang memaparkan fail yang hendak dimuat turun, dan satu lagi kaedah muat turun yang melaksanakan fungsi muat turun. Kod teras adalah seperti berikut:

@Controller
public class TestFileUpload {
  @RequestMapping("/uploadFile")
  public String uploadFile() {
    return "uploadFile";
  }
  /**
   * 上传文件自动绑定到MultipartFile对象中,
   * 在这里使用处理方法的形参接收请求参数。
     */
  @RequestMapping("/upload")
  public String upload(
      HttpServletRequest request,
      @RequestParam("description") String description,
      @RequestParam("myfile") MultipartFile myfile)
throws IllegalStateException, IOException {
    System.out.println("文件描述:" + description);
    //如果选择了上传文件,将文件上传到指定的目录uploadFiles
    if(!myfile.isEmpty()) {
      //上传文件路径
      String path = request.getServletContext().getRealPath("/uploadFiles/");
      //获得上传文件原名
      String fileName = myfile.getOriginalFilename();
      File filePath = new File(path + File.separator + fileName);
      //如果文件目录不存在,创建目录
      if(!filePath.getParentFile().exists()) {
        filePath.getParentFile().mkdirs();
      }
      //将上传文件保存到一个目标文件中
      myfile.transferTo(filePath);
    }
    //转发到一个请求处理方法,查询将要下载的文件
    return "forward:/showDownLoad";
  }
  /**
   * 显示要下载的文件
   */
  @RequestMapping("/showDownLoad")
  public String showDownLoad(HttpServletRequest request, Model model) {
    String path = request.getServletContext().getRealPath("/uploadFiles/");
    File fileDir = new File(path);
    //从指定目录获得文件列表
    File filesList[] = fileDir.listFiles();
    model.addAttribute("filesList", filesList);
    return "showFile";
  }
  /**
   * 实现下载功能
   */
  @RequestMapping("/download")
  public ResponseEntity<byte[]> download(
      HttpServletRequest request,
      @RequestParam("filename") String filename,
      @RequestHeader("User-Agent") String userAgent) throws IOException {
    //下载文件路径
    String path = request.getServletContext().getRealPath("/uploadFiles/");
    //构建将要下载的文件对象
    File downFile = new File(path + File.separator + filename);
    //ok表示HTTP中的状态是200
    BodyBuilder builder = ResponseEntity.ok();
    //内容长度
    builder.contentLength(downFile.length());
    //application/octet-stream:二进制流数据(最常见的文件下载)
    builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
    //使用URLEncoder.encode对文件名进行编码
    filename = URLEncoder.encode(filename,"UTF-8");
    /**
     * 设置实际的响应文件名,告诉浏览器文件要用于“下载”和“保存”。
     * 不同的浏览器,处理方式不同,根据浏览器的实际情况区别对待。
     */
    if(userAgent.indexOf("MSIE") > 0) {
      //IE浏览器,只需要用UTF-8字符集进行URL编码
      builder.header("Content-Disposition", "attachment; filename=" + filename);
    }else {
      /**非IE浏览器,如FireFox、Chrome等浏览器,则需要说明编码的字符集
       * filename后面有个*号,在UTF-8后面有两个单引号
       */
      builder.header("Content-Disposition", "attachment; filename*=UTF-8&#39;&#39;" + filename);
    }
    return builder.body(FileUtils.readFileToByteArray(downFile));
  }
}

5 Cipta halaman paparan muat turun fail

Dalam direktori src/main/resources/templates aplikasi ch7_2, cipta halaman paparan muat turun fail showFile. .html. Kod teras adalah seperti berikut:

<body>
  <div class="panel panel-primary">
    <div class="panel-heading">
      <h4 class="panel-title">文件下载示例</h4>
    </div>
  </div>
  <div class="container">
    <div class="panel panel-primary">
      <div class="panel-heading">
        <h4 class="panel-title">文件列表</h4>
      </div>
      <div class="panel-body">
        <div class="table table-responsive">
          <table class="table table-bordered table-hover">
            <tbody class="text-center">
              <tr th:each="file,fileStat:${filesList}">
                <td>
                  <span th:text="${fileStat.count}"></span>
                </td>
                <td>
                <!--file.name相当于调用getName()方法获得文件名称 -->
                  <a th:href="@{download(filename=${file.name})}">
                    <span th:text="${file.name}"></span>
                  </a>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    </div>
  </div>
</body>

6 Jalankan

Pertama, jalankan kelas utama Ch72Application. Kemudian, lawati http://localhost:8080/ch7_2/uploadFile untuk menguji muat naik dan muat turun fail.

Atas ialah kandungan terperinci Bagaimana SpringBoot melaksanakan fungsi muat naik dan muat turun fail. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam