【Java】SpringBoot 实现文件的上传与下载、日志记录、参数校验等(含代码示例)

2024-06-11 08:32:24 浏览数 (1)

前言

SpringBoot是一个基于Spring框架的快速开发脚手架,它提供了快速集成各种常用功能的能力,比如文件上传下载、日志记录、参数校验等。

本文将通过代码示例实现SpringBoot项目中实现这些功能。

一、文件上传与下载

1.1 添加依赖

首先,需要在pom.xml文件中添加SpringBoot的Web依赖和文件上传依赖:

代码语言:javascript复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

1.2 配置文件

在application.properties中配置文件上传的大小限制:

代码语言:javascript复制
spring.servlet.multipart.max-file-size=2MB
spring.servlet.multipart.max-request-size=10MB

1.3 文件上传 编写控制器

代码语言:javascript复制
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (!file.isEmpty()) {
            try {
                // 获取文件名
                String fileName = file.getOriginalFilename();
                // 文件处理逻辑,例如保存到服务器上的某个目录
                // file.transferTo(new File("/path/to/destination/"   fileName));
                return "You successfully uploaded "   fileName   "!";
            } catch (Exception e) {
                return "File upload failed: "   e.getMessage();
            }
        } else {
            return "Please upload a file other than an empty one.";
        }
    }
}

1.3 文件下载 编写控制器

代码语言:javascript复制
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;

@RestController
public class FileDownloadController {

    @GetMapping("/download")
    public ResponseEntity<byte[]> downloadFile() throws IOException {
        String fileName = "example.txt"; // 要下载的文件名
        File file = new File("/path/to/destination/"   fileName);

        // 将文件转换为字节数组
        byte[] fileBytes = Files.readAllBytes(file.toPath());

        // 设置响应的Header
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment; filename="   URLEncoder.encode(fileName, "UTF-8"));

        // 返回ResponseEntity对象
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(fileBytes.length)
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(fileBytes);
    }
}

二、日志记录

2.1 添加依赖

在pom.xml中添加日志框架依赖,例如使用SLF4J与Logback:

代码语言:javascript复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

2.2 使用日志

在类中注入Logger并使用:

代码语言:javascript复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SomeService {
    private static final Logger logger = LoggerFactory.getLogger(SomeService.class);

    public void someMethod() {
        logger.info("some info message");
        // 其他业务逻辑
    }
}

三、参数校验

3.1 使用注解进行校验

代码语言:javascript复制
import javax.validation.constraints.NotBlank;

public class SomeDTO {
    @NotBlank(message = "Name cannot be empty")
    private String name;

    // getters and setters
}

3.2 编写控制器并使用校验

代码语言:javascript复制
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;

@RestController
@Validated
public class SomeController {

    @PostMapping("/some-endpoint")
    public String handleSomeRequest(@Valid SomeDTO dto) {
        // 处理请求
        return "Request processed successfully";
    }
}

四、传统的controller、service、impl层写法

代码语言:javascript复制
@RestController
@RequestMapping("/file")
public class FileController {

    @Autowired
    private FileService fileService;

    // 上传单个文件
    @PostMapping("/upload")
    public ResultVo<String> uploadFile(@RequestParam("file") MultipartFile file) {
        return fileService.uploadFile(file);
    }

}

服务层写法

代码语言:javascript复制
public interface FileService {
    // 上传文件
    ResultVo<String> uploadFile(MultipartFile file);
    
}

FileServiceImpl写法

代码语言:javascript复制
@Service
@Slf4j
public class FileServiceImpl implements FileService {

    // 上传文件
    @Override
    public ResultVo<String> uploadFile(MultipartFile file) {
        log.info("【文件上传】进入到文件上传方法");
        // 1.参数校验
        if (null == file || file.isEmpty()) {
            log.error("【文件上传】文件为空!");
            throw new ParamErrorException();
        }
        // 2.上传文件
        ResultVo<String> resultVo = FileUtil.uploadFile(file);
        return resultVo;
    }

}

总结

0 人点赞