SpingMVC文件上传和文件下载

1、文件下载

使用ResponseEntity实现下载文件的功能

注意: HttpServletRequest的依赖名称应当是 javax.servlet-api 4版本, 不能出现其他版本依赖

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

@RestController
public class FileController {

@GetMapping("/download")
public ResponseEntity download(HttpServletRequest request) throws IOException {
    ServletContext servletContext = request.getServletContext();

    String realPath = servletContext.getRealPath("图片.jpg");

    FileInputStream fileInputStream = new FileInputStream(realPath);

    byte[] bytes = new byte[fileInputStream.available()];
    fileInputStream.read(bytes);

    return ResponseEntity
            .status(HttpStatus.OK)
            .header("Content-Disposition", "attachment;filename=test.jpg")
            .body(bytes);
}

这是一个用Spring框架的Java代码,其功能是作为一个文件下载控制器。这段代码定义了一个FileController类,其中包含一个download方法。这个方法通过HTTP GET请求处理/download路径的请求。

以下是代码的详细解释:

  1. @RestController: 这是Spring框架的注解,它表明这个类将作为一个REST控制器。这意味着该类的所有方法都将返回HTTP响应,而不是通常的模型和视图。
  2. public class FileController: 这是FileController类的定义。
  3. @GetMapping("/download"): 这是Spring框架的注解,它表明这个方法将处理GET请求到/download路径。
  4. public ResponseEntity download(HttpServletRequest request) throws IOException: 这是download方法的定义。它接受一个HttpServletRequest对象作为参数,并可能抛出IOException
  5. ServletContext servletContext = request.getServletContext();: 这行代码从请求对象中获取Servlet上下文。
  6. String realPath = servletContext.getRealPath("图片.jpg");: 使用Servlet上下文,这行代码获取"图片.jpg"文件的绝对路径。
  7. FileInputStream fileInputStream = new FileInputStream(realPath);: 这行代码创建一个新的FileInputStream,用于从文件系统中的指定路径读取文件。
  8. byte[] bytes = new byte[fileInputStream.available()];: 这行代码创建一个字节数组,其大小等于文件的大小。
  9. fileInputStream.read(bytes);: 这行代码从文件中读取所有字节并将它们存储在先前创建的字节数组中。
  10. return ResponseEntity.status(HttpStatus.OK).header("Content-Disposition", "attachment;filename=test.jpg").body(bytes);: 这行代码创建一个HTTP响应并返回它。响应的状态码设置为HTTP状态码200(表示成功)。响应头设置为告诉浏览器将响应的内容作为附件下载,并使用文件名"test.jpg"。响应体设置为先前读取的文件字节。

2、文件上传

文件上传要求form表单的请求方式必须为post,并且添加属性enctype=“multipart/form-data”

前端form表单中的button按钮会按照get方式提交 不会被form上的method

以后form表单中的按钮 不要使用

使用input type submit

SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息

上传步骤:

注意:5.3版本当中 可以获取到后缀名

a>添加依赖:

 commons-fileupload 1.3.1

b>在SpringMVC的配置文件中添加配置:

multipartResolver 这个配置的bean的id必须是这个名字,大小写也要完全一致

这个bean的id必须叫做multipartResolver , 类的名字是CommonsMultipartResolver

<!--    添加文件上传的bean对象-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

c>控制器方法:

/**
     * 文件上传
     * @return
     */
    @PostMapping("/file")
    public ResponseEntity uploadFile(MultipartFile upFile, HttpServletRequest request) throws IOException {
        String originalFilename = upFile.getOriginalFilename();
        System.out.println("originalFilename = " + originalFilename);

        InputStream inputStream = upFile.getInputStream();

        ServletContext servletContext = request.getServletContext();
        //必须要关联一个已存在的文件或者文件夹
        String realPath = servletContext.getRealPath("/image");
        realPath += ("/" + originalFilename);

        FileOutputStream fileOutputStream = new FileOutputStream(realPath);
        IOUtils.copy(inputStream, fileOutputStream);

        fileOutputStream.close();

        return ResponseEntity.ok().build();
    }

这段代码是一个用于上传文件的函数,基于Java的Spring框架。下面是代码的逐行解释:

1. `public ResponseEntity uploadFile(MultipartFile upFile, HttpServletRequest request) throws IOException {`
* 定义了一个名为`uploadFile`的公共方法,它接收两个参数:一个是`MultipartFile`类型的`upFile`(表示要上传的文件),另一个是`HttpServletRequest`类型的`request`(表示HTTP请求)。这个方法声明了抛出`IOException`。


2. `String originalFilename = upFile.getOriginalFilename();`
* 获取上传文件的原始文件名,并将其存储在`originalFilename`字符串变量中。


3. `System.out.println("originalFilename = " + originalFilename);`
* 打印原始文件名到控制台。


4. `InputStream inputStream = upFile.getInputStream();`
* 获取上传文件的输入流,并将其存储在`inputStream`变量中。


5. `ServletContext servletContext = request.getServletContext();`
* 从HTTP请求中获取`ServletContext`对象,该对象提供了有关Web应用程序的上下文信息。


6. `String realPath = servletContext.getRealPath("/image");`
* 获取Web应用程序中`/image`目录的实际文件系统路径,并将其存储在`realPath`字符串变量中。


7. `realPath += ("/" + originalFilename);`
* 修改`realPath`,以包括上传文件的原始文件名,从而指定文件将存储的完整路径。


8. `FileOutputStream fileOutputStream = new FileOutputStream(realPath);`
* 创建一个指向指定路径(`realPath`)的文件输出流,以便将文件写入该文件系统位置。


9. `IOUtils.copy(inputStream, fileOutputStream);`
* 使用`IOUtils.copy`方法,将文件从输入流复制到输出流。


10. `fileOutputStream.close();`
* 关闭文件输出流。这是一个重要的步骤,因为它确保所有缓冲的数据都被写入文件,并释放与流相关联的任何系统资源。


11. `return ResponseEntity.ok().build();`
* 返回一个HTTP 200(OK)响应,表示文件已成功上传。

通常,在生产环境中,您应该包含适当的错误处理(例如,如果上传的文件名已经存在,或者文件未能成功复制)。同时,对于文件名和路径的处理也需要更加安全,以防止路径遍历攻击等问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值