Spring基础分析12-文件上传下载功能

server/2024/12/24 8:08:37/

大家好,今天和大家一起学习一下spring的文件上传和下载功能~

文件上传和下载是两个非常常见的功能需求。Spring框架提供了强大的支持,使我们能够轻松地实现这些功能。

1. 环境搭建

首先,确保项目基于Spring Boot构建,并且已经正确配置了Maven或Gradle。需要添加以下依赖到pom.xml(对于Maven)或build.gradle(对于Gradle)文件中:

Maven:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 其他依赖 -->
</dependencies>

Gradle:

dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'// 其他依赖
}

此外,为了处理文件上传,可能还需要一个用于存储文件的服务器端文件系统或者云存储服务。这里假设使用的是本地文件系统。

2. 配置文件上传

在application.properties或application.yml中设置文件上传的最大大小和其他相关参数:

application.properties:

# 设置最大文件大小为10MB

spring.servlet.multipart.max-file-size=10MB

# 设置请求的最大大小为10MB

spring.servlet.multipart.max-request-size=10MB

application.yml:

spring:

  servlet:

    multipart:

      max-file-size: 10MB

      max-request-size: 10MB

3. 创建文件上传控制器

创建一个名为FileUploadController的控制器类,用于处理文件上传请求。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;@RestController
@RequestMapping("/api/files")
public class FileUploadController {private static final String UPLOAD_DIR = "uploads/";@PostMapping("/upload")public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return new ResponseEntity<>("Please select a file to upload", HttpStatus.BAD_REQUEST);}try {// Ensure the directory existsFiles.createDirectories(Paths.get(UPLOAD_DIR));// Save the file on the serverPath filePath = Paths.get(UPLOAD_DIR + file.getOriginalFilename());Files.copy(file.getInputStream(), filePath);return new ResponseEntity<>("File uploaded successfully: " + file.getOriginalFilename(), HttpStatus.OK);} catch (IOException e) {e.printStackTrace();return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);}}
}

这里定义了一个POST端点/api/files/upload,它接受一个名为file的MultipartFile作为参数,并尝试将其保存到服务器上的指定目录中。如果上传成功,则返回HTTP 200状态码;如果失败,则根据错误情况返回相应的HTTP状态码。

4. 创建文件下载控制器

接下来,创建一个名为FileDownloadController的控制器类,用于处理文件下载请求。

import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.file.Paths;@RestController
@RequestMapping("/api/files")
public class FileDownloadController {private static final String UPLOAD_DIR = "uploads/";@GetMapping("/download/{fileName:.+}")public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {try {// Load file as ResourceFile file = new File(UPLOAD_DIR + fileName);InputStreamResource resource = new InputStreamResource(new FileInputStream(file));// Try to determine file's content typeString contentType = null;try {contentType = Files.probeContentType(file.toPath());} catch (IOException ex) {// Fallback to default content type if detection failscontentType = "application/octet-stream";}// Return the file with response headersreturn ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"").contentType(MediaType.parseMediaType(contentType)).body(resource);} catch (FileNotFoundException e) {return ResponseEntity.notFound().build();}}
}

此段代码定义了一个GET端点/api/files/download/{fileName},接受一个文件名作为路径变量,并尝试从服务器上读取该文件并以附件形式返回给客户端。如果文件存在,则设置适当的响应头并返回文件;如果找不到文件,则返回HTTP 404状态码。

5. 测试上传和下载功能

可以使用Postman、cURL或者其他HTTP客户端工具来测试上述接口的功能。例如,使用cURL命令行工具可以这样测试:

  • 上传文件:

curl -X POST http://localhost:8080/api/files/upload -F "file=@path/to/your/file"

  • 下载文件:

curl -O -J http://localhost:8080/api/files/download/filename.ext

在实际生产环境中部署时,必须考虑到安全性问题。这包括但不限于验证用户身份、检查文件类型和大小、防止路径遍历攻击等。对于更高级的安全措施,如加密传输和访问控制,应根据具体的应用场景进行实施,欢迎大家一起讨论~


http://www.ppmy.cn/server/152715.html

相关文章

Slate文档编辑器-TS类型扩展与节点类型检查

Slate文档编辑器-TS类型扩展与节点类型检查 在之前我们基于slate实现的文档编辑器探讨了WrapNode数据结构与操作变换&#xff0c;主要是对于嵌套类型的数据结构类型需要关注的Normalize与Transformers&#xff0c;那么接下来我们更专注于文档编辑器的数据结构设计&#xff0c;…

hive 两次操作时间间隔大于0.5小时(LAG)

需求 明细表A记录工人的操作记录&#xff0c;create_time 是操作时间&#xff0c;需要统计操作时间间隔大于0.5小时的次数 WITH ordered_actions AS (SELECTwaybill_no,create_time,-- 使用 LAG 函数获取上一条记录的 create_timeLAG(create_time) OVER (PARTITION BY waybil…

微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁

Senparc.Weixin SDK 更新 Sample,批处理发布单个模块的 Sample 更新 Sample&#xff0c;引用最新版本 SDK NeuCharFramework 文档更新&#xff0c;提供全文检索功能 模板更新&#xff0c;提供菜单设置页面的父层节点置顶&#xff0c;解决菜单项过长&#xff0c;不容易编辑…

nginx学习总结(不包含安装过程)

1. nginx常见配置 http服务上支持【若干虚拟主机】。每个虚拟主机对应一个server配置项&#xff0c;配置项里面包含该虚拟主机相关的配置。 server{listen 80 default;server_name www.yonqin.com;index index.html index.htm index.php;root /data/www;location ~ .*\.(gif|…

Ubuntu概述

Ubuntu文件系统结构 Linux中/是一切的根目录 文件系统结构&#xff1a; Ubuntu磁盘管理 Ubuntu文件压缩 Ubuntu用户与用户组 文件权限变更

QT多媒体开发(三):使用QMediaPlayer播放视频

QMediaPlayer 类不仅能播放音频文件&#xff0c;也可以播放各种常见的视频文件&#xff0c;如 MP4 文件和 WMV 文件。QMediaPlayer 能对视频文件进行解码&#xff0c;并在某个界面组件上显示视频帧。 使用 QMediaPlayer 播放视频时&#xff0c;必须用函数 setVideoOutput()设置…

maven-resources-production:ratel-fast: java.lang.IndexOutOfBoundsException

Maven生产环境中遇到java.lang.IndexOutOfBoundsException的问题&#xff0c;尝试了重启电脑、重启IDEA等常规方法无效&#xff0c;最终通过直接重建工程解决了问题。 Rebuild Project 再启动OK

云起无垠荣获第八届“强网杯”高阶技术专项赛优秀奖

近日&#xff0c;第八届 “强网杯” 全国网络安全挑战赛线下赛于郑州高新区的网络安全科技馆赛博厅圆满落幕。云起无垠创始人兼 CEO 沈凯文博士在活动中发表了题为《安全智能体技术实践与内生安全问题思考》的精彩演讲。 沈凯文博士指出&#xff0c;当前数字化时代下网络安全领…