位置:首页 > Java技术 > SpringBoot教程 > SpringBoot 文件处理

SpringBoot 文件处理

在本章中,将学习如何使用Web服务上载和下载文件。

上传文件

对于上载文件,要将MultipartFile用作请求参数,此API应使用多部分表单数据值。 观察下面给出的代码 -

@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

public String fileUpload(@RequestParam("file") MultipartFile file) {
   return null;
}


下面给出了相同的完整代码 -

package com.codeinn.demo.controller;

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

import org.springframework.http.MediaType;
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;

@RestController
public class FileUploadController {
   @RequestMapping(value = "/upload", method = RequestMethod.POST, 
      consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

   public String fileUpload(@RequestParam("file") MultipartFile file) throws IOException {
      File convertFile = new File("/var/tmp/"+file.getOriginalFilename());
      convertFile.createNewFile();
      FileOutputStream fout = new FileOutputStream(convertFile);
      fout.write(file.getBytes());
      fout.close();
      return "File is upload successfully";
   }
}


文件下载

对于文件下载,应该使用InputStreamResource下载文件。需要在Response中设置HttpHeader Content-Disposition,并且需要指定应用程序的响应Media Type。

注 - 在以下示例中,文件应在运行应用程序的指定路径上可用。

@RequestMapping(value = "/download", method = RequestMethod.GET) 
public ResponseEntitydownloadFile() throws IOException  {
   String filename = "/var/tmp/mysql.png";
   File file = new File(filename);
   InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
   HttpHeaders headers = new HttpHeaders();

   headers.add("Content-Disposition", String.format("attachment; filename=\\"%s\\"", file.getName()));
   headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
   headers.add("Pragma", "no-cache");
   headers.add("Expires", "0");

   ResponseEntityresponseEntity = ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(
      MediaType.parseMediaType("application/txt")).body(resource);

   return responseEntity;
}

下面给出了相同的完整代码 -
package com.codeinn.demo.controller;

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

import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FileDownloadController {
   @RequestMapping(value = "/download", method = RequestMethod.GET) 
   public ResponseEntitydownloadFile() throws IOException  {
      String filename = "/var/tmp/mysql.png";
      File file = new File(filename);
      InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
      HttpHeaders headers = new HttpHeaders();

      headers.add("Content-Disposition", String.format("attachment; filename=\\"%s\\"", file.getName()));
      headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
      headers.add("Pragma", "no-cache");
      headers.add("Expires", "0");

      ResponseEntityresponseEntity = ResponseEntity.ok().headers(headers).contentLength(
         file.length()).contentType(MediaType.parseMediaType("application/txt")).body(resource);

      return responseEntity;
   }
}
主要的Spring Boot应用程序如下 -
package com.codeinn.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}
Maven构建文件 - pom.xml 的代码如下 -
4.0.0com.codeinndemo0.0.1-SNAPSHOTjardemoDemo project for Spring Bootorg.springframework.bootspring-boot-starter-parent1.5.8.RELEASEUTF-8
      UTF-8
      1.8org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin
Gradle构建文件 - build.gradle 的代码如下 -
buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.codeinn'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
现在创建一个可执行的JAR文件,并使用下面给出的Maven或Gradle命令运行Spring Boot应用程序:

对于Maven,请使用下面给出的命令 -

mvn clean install


在“BUILD SUCCESS”之后,在target目录下找到JAR文件。

对于Gradle,可以使用下面显示的命令 -

gradle clean build


在“BUILD SUCCESSFUL”之后,在build/libs 目录下找到JAR文件。

现在,使用以下命令运行JAR文件 -

java –jar
这将在Tomcat端口8080上启动应用程序。
现在点击 POSTMAN 应用程序中的以下URL,可以看到如下所示的输出 -
文件上传 - http://localhost:8080/upload


文件下载 - http://localhost:8080/download