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

news2024/12/24 12:52:58

大家好,今天和大家一起学习一下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 exists
           Files.createDirectories(Paths.get(UPLOAD_DIR));

            // Save the file on the server
            Path 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 Resource
            File file = new File(UPLOAD_DIR + fileName);
           InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

            // Try to determine file's content type
            String contentType = null;
            try {
                contentType = Files.probeContentType(file.toPath());
            } catch (IOException ex) {
                // Fallback to default content type if detection fails
                contentType = "application/octet-stream";
            }

            // Return the file with response headers
            return 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.coloradmin.cn/o/2264726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity引擎学习总结------动画控件

左侧窗格可以在参数视图和图层视图之间切换。参数视图允许您创建、查看和编辑动画控制器参数。这些是您定义的变量&#xff0c;用作状态机的输入。要添加参数&#xff0c;请单击加号图标并从弹出菜单中选择参数类型。要删除参数&#xff0c;请在列表中选择该参数并按删除键&…

UE4_用户控件_1_滑块控制图像颜色的变化

祝愿大美兰陵越来越好&#xff0c;祝愿祖国繁荣昌盛&#xff0c;祝愿人民幸福安康&#xff01; 一、样式展示&#xff1a; 效果&#xff0c;当角色靠近物体&#xff08;只有一个胶囊碰撞体&#xff09;时显示用户控件&#xff0c;调整控件中的滑块值&#xff0c;可以改变UE4lo…

网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取

一、概述 记录时间 [2024-12-18] 前置文章&#xff1a;网络编程 01&#xff1a;计算机网络概述&#xff0c;网络的作用&#xff0c;网络通信的要素&#xff0c;以及网络通信协议与分层模型 本文讲述网络编程相关知识——IP 地址&#xff0c;包括 IP 地址的作用、分类&#xff…

【pycharm】远程服务器之后如何打开终端

【pycharm】远程服务器之后如何打开终端 在pycharm中&#xff0c;我们通过远程连接服务器&#xff0c;此时如果我们需要在终端运行的话&#xff0c;并不能直接在本地终端运行&#xff0c;而是需要连接到服务器终端才能运行命令 设置如下&#xff1a; 输入服务器的ip、端口、…

C#+OpenCv深度学习开发(常用模型汇总)

在使用 OpenCvSharp 结合深度学习进行机器视觉开发时&#xff0c;有许多现成的模型可以使用。以下是一些常用的深度学习模型&#xff0c;适用于不同的机器视觉任务&#xff0c;包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…

dolphinscheduler服务注册中心源码解析(三)RPC提供者服务整合注册中心注册服务实现源码

RPC提供者服务整合注册中心注册服务实现源码 1.概述2.源码解读思路3.实现2.1.应用服务的RPC服务接口定义2.1.1.MasterServer应用中提供的RPC接口服务2.1.2.WorkerServer应用中提供的RPC接口服务2.2.应用服务的RPC服务接口实现2.2.1.MasterServer应用中提供的RPC接口服务实现类2…

重生之我在异世界学编程之C语言:数据在内存中的存储篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 引言正文一、数据类型介绍1.内置类型2.自定义…

线程的概念及基本应用

目录 线程的概念 Java中多线程应用 继承Thread类 实现Runnable接口 实现Callable接口 线程的生命周期 线程的基本操作及原理 Thread.join的使用及原理 Thread.sleep的作用 问题 Thread.sleep的工作流程 wait和notify的使用 wait notify 例子 生产者消费者模式 Th…

联通软研院:基于OceanBase落地检索增强生成 (RAG) 的应用实践

本文作者&#xff1a;邱永刚&#xff0c;联通软件研究院OceanBase研发负责人&#xff0c;主要负责中国联通自研关系型数据库分布式CUDB研发、支撑、运维工作。 近年来&#xff0c;生成式人工智能技术取得了飞速进步&#xff0c;很多大模型在自然语言处理及对话系统领域的运用吸…

【更新】LLM Interview

课程链接&#xff1a;BV1o217YeELo 文章目录 LLM基础相关1. LLMs概述2. 大语言模型尺寸3. LLMs的优势与劣势4. 常见的大模型分类5. 目前主流的LLMs开源模型体系有哪些&#xff08;Prefix Decoder&#xff0c;Causal Decoder&#xff0c;Encoder-Decoder的区别是什么&#xff09…

模型 课题分离

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例&#xff1a;李晓的故事 李晓&#xff0c;一位28岁的软件工程师&#xff0c;在北京打拼。他面临着工作、家庭和感情的多重…

sqlite 自定以脚本解释器

应用程序使用 libfdt 解析设备树,获取兼容性配置 内核源码支持libfdt 标准设备树语法,不用自己再创造 非常的爽,因为设备树支持预编译 一些可以跑类 BSD 系统的设备也可以使用这样的方法,不仅仅是在linux 系统上跑 有pylibfdt 支持解析设备树&#xff0c;校验设备树是否是正确的…

某医院vsan部署技术手册

环境配置 服务器4900G5五台 配置信息&#xff1a;cpu 8368*2颗 &#xff0c;内存256GB ,双口万兆网卡两个&#xff0c;四口千兆&#xff0c;RAID卡LSI9361-8i12G SAS RAID &#xff0c;两块固态盘480SSD &#xff0c;2*1.92TB NVME盘&#xff0c;5*8T盘。 万兆交换机两台H3C…

【编辑器扩展】打开持久化路径/缓存路径/DataPath/StreamingAssetsPath文件夹

代码 [MenuItem("Assets/Open Explorer/PersistentDataPath")]public static void OpenPersistentDataPath(){Application.OpenURL(Application.persistentDataPath);}[MenuItem("Assets/Open Explorer/DataPath")]public static void OpenDataPath(){Appl…

【day14】异常处理与Object类深入解析

【day13】回顾 在深入探讨异常处理与Object类之前&#xff0c;让我们回顾一下【day13】中的关键内容&#xff1a; 权限修饰符&#xff1a; public&#xff1a;最广的访问范围&#xff0c;任何地方都可以访问。protected&#xff1a;在同包和子类中可以访问。默认&#xff08;无…

【NLP 17、NLP的基础——分词】

我始终相信&#xff0c;世间所有的安排都有它的道理&#xff1b;失之东隅&#xff0c;收之桑榆 —— 24.12.20 一、中文分词的介绍 1.为什么讲分词&#xff1f; ① 分词是一个被长期研究的任务&#xff0c;通过了解分词算法的发展&#xff0c;可以看到NLP的研究历程 ② 分词…

11.vector的介绍及模拟实现

1.vector的介绍 记得之前我们用C语言实现过顺序表&#xff0c;vector本质上也是顺序表&#xff0c;一个能够动态增长的数组。 vector 的底层实现机制 - 动态数组&#xff1a;vector 的底层实现是动态数组。它在内存中连续存储元素&#xff0c;就像一个可以自动调整大小的数…

# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)

↑ 上方下载文档 (大小374KB) 接口文档预览 (超过50个接口) 一、数据库25张表er-关系清晰构图&#xff01;(tip: 鼠标右键图片 > 放大图像) 二、难点/经验 详细说明 热门评论排序评论点赞列表|DTO封装经验分享|精华接口文档说明 组员都说喜欢分档对应枚举码 如果这篇文章…

android RecyclerView 垂直显示示例(java)

RecyclerView垂直列表显示示例&#xff0c;显示图片加文字。 1、RecyclerView.Adapter适配器 public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {private Context mContext;private List<TitleBean> titleBeans;public ListAdapt…

华为云语音交互SIS的使用案例(文字转语音-详细教程)

文章目录 题记一 、语音交互服务&#xff08;Speech Interaction Service&#xff0c;简称SIS&#xff09;二、功能介绍1、实时语音识别2、一句话识别3、录音文件识别4、语音合成 三、约束与限制四、使用1、API2、SDK 五、项目集成1、引入pom依赖2、初始化 Client1&#xff09;…