Spring Boot实现文件上传与下载

Spring Boot 实现文件上传下载功能 进入前端页面的 URL 为 http://localhost:8080/upload.html。该部分代码为 [2.2 文件上传功能实现](###2.2 文件上传功能实现) 的前端实现。文件下载则只是简单的 GET 请求。现有的 Web 框架都内置了处理文件上传的功能。指定了文件在请求体中的键,后端服务器将通过这个名称来获取文件数据。是用来表示上传的文件,服务器会自动解析该文件并进行处理。,并选择一个文件进行上传。将文件上传的具体逻辑抽象到一个。将文件上传的具体逻辑抽象到一个。请求,下载指定的文件。 阅读详情

GitHub:SpringBootDemo
Gitee:SpringBootDemo
微信公众号:在这里插入图片描述

0. 开发环境

  • IDE:IntelliJ IDEA 2017.1 x64

  • jdk:1.8.0_91

  • Spring Boot:2.1.1.RELEASE


1. 文件下载

1.1 新建服务类

import cn.wbnull.springbootdemo.boot.GlobalException;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;

@Service
public class LogService {

    public void logDownload(String name, HttpServletResponse response) throws Exception {
        File file = new File("logs" + File.separator + name);

        if (!file.exists()) {
            throw new GlobalException(name + "文件不存在");
        }
        response.setContentType("application/force-download");
        response.addHeader("Content-Disposition", "attachment;fileName=" + name);

        byte[] buffer = new byte[1024];
        try (FileInputStream fis = new FileInputStream(file);
                      BufferedInputStream bis = new BufferedInputStream(fis)) {

            OutputStream os = response.getOutputStream();

            int i = bis.read(buffer);
            while (i != -1) {
                os.write(buffer, 0, i);
                i = bis.read(buffer);
            }
        }
    }
}

1.2 新建控制器类

import cn.wbnull.springbootdemo.service.LogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

@RestController
@Scope("prototype")
@RequestMapping("/log")
public class LogController {

    @Autowired
    private LogService logService;

    /**
     * 下载日志接口
     *
     * @param name
     * @param response
     * @throws Exception
     */
    @GetMapping(value = "/download/{name}")
    public void logDownload(@PathVariable String name, HttpServletResponse response) throws Exception {
        logService.logDownload(name, response);
    }
}

1.3 测试

上面接口是要下载logs文件夹下日志文件,以log_20190218.log日志文件为例,浏览器直接访问 http://127.0.0.1:8090/springbootdemo/log/download/log_20190218.log 即可完成下载。
在这里插入图片描述
在这里插入图片描述

2. 单文件上传

2.1 新建服务类

import cn.wbnull.springbootdemo.boot.GlobalException;
import cn.wbnull.springbootdemo.model.ReturnMessage;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;

@Service
public class LogService {

    public JSONObject logUpload(MultipartFile file) throws Exception {
        if (file == null || file.isEmpty()) {
            throw new GlobalException("未选择需上传的日志文件");
        }

        String filePath = new File("logs_app").getAbsolutePath();
        File fileUpload = new File(filePath);
        if (!fileUpload.exists()) {
            fileUpload.mkdirs();
        }

        fileUpload = new File(filePath, file.getOriginalFilename());
        if (fileUpload.exists()) {
            throw new GlobalException("上传的日志文件已存在");
        }

        try {
            file.transferTo(fileUpload);

            return ReturnMessage.success();
        } catch (IOException e) {
            throw new GlobalException("上传日志文件到服务器失败:" + e.toString());
        }
    }
}

2.2 新建控制器类

import cn.wbnull.springbootdemo.service.LogService;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

@RestController
@Scope("prototype")
@RequestMapping("/log")
public class LogController {

    @Autowired
    private LogService logService;

    /**
     * 上传日志接口
     *
     * @param file
     * @return
     * @throws Exception
     */
    @PostMapping(value = "/upload")
    public JSONObject logUpload(@RequestParam("file") MultipartFile file) throws Exception {
        return logService.logUpload(file);
    }
}

2.3 新建HTML页面

log-upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<form method="post" action="/log/upload" enctype="multipart/form-data">
    <input type="file" name="file">
    <br><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

2.4 测试

浏览器打开页面 http://127.0.0.1:8090/springbootdemo/log-upload.html
在这里插入图片描述
点击选择文件打开文件选择页面,选中需要上传的文件后,点击提交,返回如下则为文件上传成功。
在这里插入图片描述
我们去logs_app文件夹下查看,生成了上传的日志文件。
在这里插入图片描述

2.5 Java客户端上传文件

上面我们上传文件的客户端为HTML页面,但我们实际生产中未必是WebAPP,这时我们可以通过模拟发送浏览器HTTP请求来实现上传文件。

2.5.1 引入依赖

        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>

2.5.2 新建Java客户端

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.junit.Test;

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

public class LogControllerTests {

    @Test
    public void logUpload() throws Exception {
        String url = "http://127.0.0.1:8090/springbootdemo/log/upload";
        String pathname = new File("logs" + File.separator + "log_20190310.log").getCanonicalPath();
        logUpload(url, pathname);
    }

    private static void logUpload(String url, String pathname) {
        HttpClient httpClient = new HttpClient();
        PostMethod postMethod = new PostMethod(url);

        try {
            FilePart filePart = new FilePart("file", new File(pathname));
            Part[] parts = {filePart};

            MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(parts, new HttpMethodParams());
            postMethod.setRequestEntity(multipartRequestEntity);
            httpClient.executeMethod(postMethod);
            String result = postMethod.getResponseBodyAsString();

            System.out.println(result);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            postMethod.releaseConnection();
        }
    }
}

这里,以下两行代码表示设置多媒体参数,作用类似form表单中的enctype=“multipart/form-data”

MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(parts, new HttpMethodParams());
postMethod.setRequestEntity(multipartRequestEntity);

以下两行代码表示设定参数名称和值,类似form表单中的<input name="file” type=“file” />

FilePart filePart = new FilePart("file", new File(pathname));
Part[] parts = {filePart};

2.5.3 测试

测试类运行成功。
在这里插入图片描述
文件上传成功
在这里插入图片描述

3. 多文件上传

3.1 新建服务类

    public JSONObject logUploads(HttpServletRequest request) throws Exception {
        List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");

        for (MultipartFile file : files) {
            logUpload(file);
        }

        return ReturnMessage.success();
    }

3.2 新建控制器类

    /**
     * 批量上传日志接口
     *
     * @param request
     * @return
     * @throws Exception
     */
    @PostMapping(value = "/uploads")
    public JSONObject logUploads(HttpServletRequest request) throws Exception {
        return logService.logUploads(request);
    }

3.3 新建HTML页面

log-uploads.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>批量文件上传</title>
</head>
<body>
<form method="post" action="log/uploads" enctype="multipart/form-data">
    <input type="file" name="file"><br>
    <input type="file" name="file"><br>
    <input type="file" name="file"><br>
    <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

3.4 测试

我们先把之前测试上传的logs_app文件夹整个删除,然后浏览器打开页面 http://127.0.0.1:8090/springbootdemo/log-uploads.html
在这里插入图片描述
选择要上传的文件
在这里插入图片描述
点击提交,返回如下则为上传成功。
在这里插入图片描述
我们去logs_app文件夹下查看,生成了上传的日志文件。
在这里插入图片描述

3.5 Java客户端上传文件

这里如果我们也需要Java客户端实现多文件上传,可以仿照2.5实现。


微信:https://mp.weixin.qq.com/s/rd6yhfMjwU7Pn3c46bKj7w


使用Spring Boot实现文件下载功能 通过创建一个RestController处理文件下载请求,并设置响应头和输出文件流,实现了简单而有效的文件下载功能。文件下载是Web应用中常见的功能之一,通过Spring Boot可以很方便地实现文件下载功能。本文将详细介绍如何使用Spring Boot编写一个简单的文件下载接口,包括处理文件下载请求、设置响应头和实现文件流输出等。可以使用Spring Initializr(https://start.spring.io/)快速生成一个基础的Spring Boot项目,添加Web依赖即可。 阅读详情

相关推荐

Spring Boot 实战:轻松实现文件上传与下载功能

本文围绕 Spring Boot 文件上传与下载功能展开。介绍其依赖引入、配置设置,详述上传接口编写与安全要点,涵盖类型限制、大小验证及防覆盖措施。在下载功能上,讲解从基础接口到异常处理再到断点续传的实现,并以实战案例展示应用场景,为开发者提供全面实用的功能开发指引,助其构建相关应用系统。

2401_85969651的博客 4441

Java利用阿里云OSS/本地存储实现文件上传功能

本文介绍Java实现文件存储和回显(阿里云OSS和本地)

逐梦苍穹的博客 8701

Java领域Spring Boot的文件上传与下载功能实现

在当今的互联网应用中,文件的上传与下载是非常常见且重要的功能。无论是社交媒体平台上的图片、视频上传,还是企业系统中的文档管理,都离不开文件的上传与下载。本文章的目的是详细介绍如何在Java的Spring Boot框架中实现文件的上传与下载功能。范围涵盖了从基本的概念理解、核心算法原理、具体的代码实现,到实际应用场景的分析以及相关资源的推荐等方面,帮助开发者全面掌握这一技术。本文将按照以下结构进行阐述:首先介绍核心概念与联系,包括HTTP协议在文件上传与下载中的作用等;

AI开发架构师 1275

SpringBoot下载文件的正确方式~

Spring Boot 在文件流下载时,加入异常报警,更具灵活性

dubulingbo的博客 1万+

Spring Boot实现文件上传下载功能详解

为了提高前端处理异常的便利性,建议统一返回结构化的错误对象,例如:"message": "文件大小超出限制,请上传更小的文件",可以定义一个通用的异常响应类:// 构造方法、Getter和Setter并在异常处理器中使用:error.setMessage("文件大小超出限制,请上传更小的文件");

weixin_34640289的博客 1085

知识图谱-Neo4j-开始构建知识图谱-01

关系(Relationships):连接两个节点,具有方向(→ 或 ←)和类型(Type),可附加属性。 属性(Properties):键值对,存储节点或关系的详细信息(如 , )。 (2) Cypher 查询语言 直观语法:通过模式匹配直接描述图结构。 高效遍历:支持复杂关系路径查询(如最短路径、模式匹配)。 3. 核心优势 (1) 原生图存储 物理存储优化:数据以图结构直接存储,避免传统数据库的“表连接”开销。 高效遍历:通过指针直接访问相邻节点,时间复杂度接近 O(1)。 (2) 高性

寓教于乐。教己助人 1万+

Spring Boot 实现文件上传和下载

通过本文的介绍,你已经学会了如何在Spring Boot中实现文件的上传和下载功能。文件上传通过类处理,而文件下载则通过实现。这些功能在大多数Web应用中都非常实用,希望本文能帮助你更好地理解和应用这些技术。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章。

ning的博客 1817

上机笔试题目:取出指定条件二维数组的子数组

取出指定条件二维数组的子数组: 1)传入参数为: 参数一:String[][]sArray2字符串二维数组 参数二:Stringkey字符串 参数三:StringkeyFormat含匹配符的字符串,如下:%0-%1,其中%x含义如为:一维数据列序号为x的值。 keyFormat 可以为 %0-%1-%2,%0-%3-%8-%x...... 例子如下...

91奔跑的蜗牛 636

spring boot实现文件上传和下载

System.out.println(“电脑上的路径=”+file.getAbsolutePath()+“/”+newFileName);在文件上传的时候,MultipartFile中的transferTo(dest)方法只能使用一次;System.out.println(“文件-”+downloadFilePath+“存在”);System.out.println(“文件被上传到了服务器路径为----”+path);System.out.println(“要上传的文件名=”+fileName);

2401_84010402的博客 878

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 327

解决mamba_ssm库安装难题:两种高效方法详解

本文详细解析了mamba_ssm库安装失败的常见原因,并提供了两种高效的解决方案。针对其依赖C++/CUDA扩展编译的特性,文章手把手指导用户通过GitHub克隆源码编译安装,或寻找匹配的预编译Wheel文件直接安装,帮助开发者彻底解决环境配置难题,顺利部署Mamba模型。

weixin_29056865的博客 553

Spring Boot实现 文件上传与下载,包括前端界面实现

新建SpringBoot工程 (略...) 参数配置 项目创建完成之后,需要设置一些必要的参数,打开项目resources目录下配置文件application.properties,在其中添加以下参数: server.port=80 ## MULTIPART (MultipartProperties) # 开启 multipart 上传功能 spring.servlet.multipa...

liinux-Talk is cheap,show me the code. 1809

【SAP中的框架协议】

在SAP中,框架协议(Framework Agreement) 是企业与供应商签订的长期采购约束文件,用于简化重复性采购流程、锁定交易条款并降低管理成本。

m0_73548864的博客 1294

Spring Boot文件上传下载实现详解

本文介绍了在Spring Boot应用中实现文件上传和下载功能的方法。首先概述了文件操作在现代Web应用中的重要性及Spring Boot框架的优势。接着详细说明环境准备步骤和项目配置。核心内容包括:使用MultipartFile实现单文件和多文件上传,配置上传参数限制文件大小;提供文件下载的两种方式(直接下载和在线预览),并演示如何通过ResponseEntity和Resource实现。最后提到文件存储服务的抽象思路,为系统扩展性提供参考。全文采用代码示例与理论说明相结合的方式,涵盖从基础实现到进阶优化的

随便写写 1441

uniapp - 详细手机端h5网页调用手机摄像头进行二维码识别扫描,在uniapp的H5移动端微信网页平台中,在浏览器中调用手机扫码功能详细教程,识别二维码并获取扫描结果(完整示例源码,一键复制即用

uniapp,h5,手机端网页,H5手机网页,uniapp开发h5实现扫码功能,uniapp微信h5网页扫码sdk使用教程,uniapp h5网页如何实现浏览器扫码,uniapp扫码功能怎么兼容h5_uniapph5怎么做扫码功能,uniapp的手机网页如何实现扫二维码一维码,浏览器H5实现js扫码,H5调用摄像头和扫一扫功能,亲测可用,H5调用本地摄像头实现扫一扫,uni-h5项目解决扫码功能,uniapp实现微信H5扫码,解决uniapp在H5端使用不能扫码问题,uni-app的h5扫码(二维码、条形码

✅ 精选推荐文章 1万+

使用Qt Creator自带的Qt Designer构造UI界面流程总结

在本文中,我们将总结使用Qt Creator自带的Qt Designer构造UI界面的流程。在对话框中,您可以选择一个控件的信号,然后将其连接到另一个控件的槽。例如,您可以将按钮的点击信号连接到一个槽函数,以响应按钮的点击事件。右键单击窗口设计器中的空白区域,选择适当的布局管理器,如水平布局、垂直布局或网格布局。在Qt Designer中,您可以使用各种预定义的UI控件来设计应用程序的界面。现在,您可以在应用程序的源代码中使用生成的UI界面。在您的源文件中,包含相应的头文件,然后创建一个UI界面的实例。

cl6789的博客 1392

Spring Boot | 基于MinIO实现文件上传和下载

在现代的 web 应用中,文件上传和下载是常见的需求。MinIO 是一个开源的高性能分布式对象存储服务,可以用来存储和管理大量的非结构化数据,如图片、视频、日志文件等。本篇博客将介绍如何在 Spring Boot 应用中,结合 MinIO 来实现文件的上传和下载功能,并使用 Feign 客户端进行远程调用文件上传和下载的服务。MinIO 是一个高性能的分布式对象存储系统,兼容 Amazon S3 API,通常用于存储和管理大量非结构化数据,如图片、视频、备份、日志等。

Andya_net的博客 1836

手把手教你学 MATLAB 实战训练(6.5):基础实战实例

MATLAB 是一款强大的数学软件,广泛应用于工程计算、信号处理、控制系统设计、图像处理等领域。学习 MATLAB 不仅可以提高你的编程技能,还能帮助你解决实际的数学和工程问题。下面我将通过几个实战训练实例来教你如何使用 MATLAB。

xiaoheshang_123的博客 366

Spring Boot实现文件上传和下载

Web项目中,文件的上传和下载服务也是基于HTTP请求的,文件上传由于需要向服务接口提交数据,可以使用POST的请求方式,而文件的下载只是获取数据,因此可以使用GET请求方式。项目中经常会有上传和下载的需求,这篇文章简述一下springboot项目中实现简单的上传和下载。创建好指定的文件存放路径文件夹后,上传逻辑只需要将接收到的文件数据赋值到指定路径后即可。文件的下载逻辑是根据指定的文件名称到文件资源文件夹中获取,如果存在则返回文件。以上只是一些关键代码,所有代码请参见下面代码仓库。

HBLOG 1406

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[技术资料]轻松实现Spring Boot文件上传与下载:实用代码示例

在Spring Boot应用中,实现文件上传和下载功能是非常简单且高效的。通过类进行文件上传,通过类配合进行文件下载,可以很方便地处理常见的文件操作。文件上传:通过对象获取文件并使用transferTo方法保存文件。文件下载:通过和设置文件下载响应,确保浏览器正确处理下载文件。路径配置:使用获取文件的存储路径和下载路径。此功能在许多Web应用中是基础需求之一,例如文件管理系统、个人资料上传等。通过Spring Boot的自动配置和简洁的API,可以让文件上传和下载变得更为简便和高效。

liliYoung_的博客 1167

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Spring Boot 实现文件上传与下载

本文介绍了使用Spring Boot 3实现文件上传和下载功能的完整方案。主要内容包括:配置上传文件大小限制;实现文件存储服务,使用UUID重命名避免冲突;创建REST接口处理上传下载请求;统一异常处理;以及测试方法。文章提供了详细的代码示例,涵盖单文件上传、自动创建目录、文件下载等功能,适合作为企业级文件上传功能的参考实现。

qq_29029209的博客 228

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

spring boot+thymeleaf 文件上传,下载功能实现

1,pom.xml文件添加thymeleaf依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> properties文件设置thymeleaf # thymeleaf spr

梁晨le的Blog 1464
上一篇: Spring Boot整合Swagger2
下一篇: Spring Cloud整合Spring Boot(服务提供者和服务消费者)
程序员null
博客等级 码龄11年 1304粉丝 124原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值