文件的上传与下载 (springboot---终极版)

springboot整合vue实现上传下载文件 springboot整合vue实现上传下载文件 文章目录springboot整合vue实现上传下载文件1上传下载文件api文件2.上传大文件配置3.vue前端主要部分 环境 springboot 1.5.x 完整代码下载: springboot整合vue实现上传下 1上传下载文件api文件 设置上传路径,如例子: private final static String rootPath =... 阅读详情

上传与下载

package com.zkw.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zkw.Mapper.FileMapper;         //mapper文件
import com.zkw.entity.FileEntity;        //实体类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

@RestController
@RequestMapping("/file")
public class TestFileController {

    //引入yml配置文件中的配置
    @Value("${file.upload.path}")
    private String fileUploadPath;

    @Resource
    private FileMapper fileMapper;


    /**
     * 文件上传
     * @param file
     * @param request
     * @return
     */
    @PostMapping("/upload")
    public String upload (@RequestParam MultipartFile file, HttpServletRequest request){
        String filename = file.getOriginalFilename();
        String type = FileUtil.extName(filename);
        long size = file.getSize();

        //先存储到磁盘上
        File uploadFile = new File(fileUploadPath);

        //判断配置文件目录是否存在,不存在就创建
        if (!uploadFile.exists()){
            uploadFile.mkdirs();
        }
        //定义一个文件唯一的标识码
        String uuid = IdUtil.fastSimpleUUID();
        //在uuid后边加上文件的类型 StrUtil.DOT 表示的是一个 .
        String fileUUID = uuid + StrUtil.DOT + type;
        //上传的文件的最终路径
        File uploadFilePath = new File(fileUploadPath + fileUUID);

        try {
            //把获取到的文件存储到磁盘目录上
            file.transferTo(uploadFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //对文件尽心md5
        String md5 = SecureUtil.md5(uploadFilePath);
        String url = null;

        //通过文件的md5查询 此时上传的文件是都存在
        QueryWrapper<FileEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("md5",md5);
        List<FileEntity> list = fileMapper.selectList(wrapper);
        FileEntity fileEntity = list.size() == 0 ? null : list.get(0);

        //得到浏览器中的url
        StringBuffer oldUrl = request.getRequestURL();

        //把浏览器的url进行替换,得到图片地址
        StringBuffer newUrl = oldUrl.replace(oldUrl.indexOf("upload"),oldUrl.length(), fileUUID);

        //判断文件是否 是第一次上传
        if (fileEntity == null){
            url = newUrl + "";
        }else{
            //文件存在就删除
            uploadFilePath.delete();
            url = fileEntity.getUrl();
        }

        //存储数据库
        FileEntity saveFiles = new FileEntity();
        saveFiles.setName(filename);
        saveFiles.setType(type);
        saveFiles.setSize(size / 1024);
        saveFiles.setUrl(url);
        saveFiles.setMd5(md5);
        fileMapper.insert(saveFiles);
        return saveFiles.getUrl();
    }

    /**
     * 文件下载
     * @param fileUUID //下载时标识这个文件的参数
     * @param response
     */
    @GetMapping("/{fileUUID}")
    public void download(@PathVariable String fileUUID, HttpServletResponse response){
        //根据文件的唯一标识码获取文件
        File uploadFile = new File(fileUploadPath + fileUUID);

        //设置输出流的格式
        ServletOutputStream os = null;
        try {
            os = response.getOutputStream();
            response.addHeader("Content-Disposition","attachment;filename" + URLEncoder.encode(fileUUID, "UTF-8"));
            response.setContentType("application/octet-stream");

            //使用了hutool 工具类 里边的一个方法,字节流的方式读出文件
            os.write(FileUtil.readBytes(uploadFile));

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                os.flush();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}

yaml 文件配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

file:
  upload:
    path: D:\files\ # 问价上传到磁盘上的位置

mybatis-plus 配置

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@MapperScan("com.zkw.mapper") // 扫描mapper文件
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,
     * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false
     * 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

FileMapper.java 的写法

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zkw.entity.FileEntity;


public interface FileMapper extends BaseMapper<FileEntity> {
}

所使用到的依赖


 <!--mybatis依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.3.1</version>
</dependency>

<!--sql 驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>

 
<!--hutool工具-->
<dependency>
   <groupId>cn.hutool</groupId>
   <artifactId>hutool-all</artifactId>
   <version>5.7.20</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>4.1.2</version>
</dependency>


<!--mybatis-plus依赖-->
<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.5.1</version>
</dependency>

sql 文件

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for t_file
-- ----------------------------
DROP TABLE IF EXISTS `t_file`;
CREATE TABLE `t_file` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `type` varchar(255) DEFAULT NULL,
  `size` bigint DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `md5` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

SpringBoot + SFTP 实现文件上传与下载实战 背景 近期在工作中需要实现文件的上传与下载,一开始打算使用一些高级的文件系统,比如:FastDFS,GlusterFS,CephFS,这些高级厉害的文件存储系统,当然博主也花了两周的时间把这三个FS都玩了一遍。个人认为FastDFS使用以及部署最简单,比较适合存储图片以及中小型文件(<500M),毕竟是国产框架(点赞);而GlusterFS和Cep... 阅读详情

相关推荐

基于Springboot和Mybatis的文件上传与下载

0. 前言 因为太久太久没有碰项目了(上一次还是2021年8月开发个人博客的时候),所以这一次打算从头到尾把整个学习和搭建的过程记录下来。 1. 简介 这是一个基于SpringBoot和Mybatis的企业级文件上传下载的实战项目,没有太多前端和UI的东西。 2. 链接 【编程不良人】基于SpringBoot和Mybatis企业级文件上传下载项目实战 1. 设计 1. 需求 用户登陆,展示用户的所有文件(文件如果是图片则在页面中显示图片) 完成文件的下载和在线打开(在线打开不计入下载次数) 在一张页面中完

三明治文鱼的博客 3124

Springboot大文件上传下载实现思路

Springboot大文件上传下载实现思路

Eddie_920的博客 1867

SpringBoot文件上传下载详解

下载的原理其实就是根据你要下载的文件名看看我们的磁盘中有没有这个文件对比一下文件名字,如果有就下载,没有就下载失败。首先理解一下文件上传的原理,其实就是把传过来的文件存到我们的磁盘上,既然要存磁盘所以我们得指定文件存储的路径等。这篇文章记录我自己的学习过程的SpringBoot的文件上传下载的代码的理解。代码写完了介绍问了,接下来测试一下看看我们的接口能不能用。可以看到上传成功了,也生成了文件名。首先先把代码写上,然后逐一理解。我的路径值得就是这个。

Fzyabc的博客 1292

有关Springboot实现大文件上传、下载

【代码】有关Springboot实现大文件上传、下载。

九七的博客 592

Spring Boot讲义.pdf

springboot的快速入门

H5获取手机相机或相册图片两种方式-Android通过webview传递多张照片给H5

H5调用公共获取图片文件方法,在android手机端,H5主要依赖Webview,这边在webview声明并重写该方法onShowFileChooser使用工具类打开相机或相册,可以两种方式安卓原生方式或者利用第三方组件库方式选中图片,返回uri列表给H5H5收到uri照片列表,并且使用前端方式展示创造价值,乐哉分享!

m0_74823947的博客 3096

SpringBoot实现大文件上传/下载(分片、断点续传)

参考文章:http://blog.ncmem.com/wordpress/2023/11/04/springboot%e5%ae%9e%e7%8e%b0%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0-%e4%b8%8b%e8%bd%bd%e5%88%86%e7%89%87%e3%80%81%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/大文件秒传:实际上是根据文件名称区一个唯一的md5值存储,传文件时进行判断,若存在则不传。

weixin_45525177的博客 2058

RealSense D455启动教程

RealSense D455启动教程 修改rs_camera.launch

每天进步一点点 2417

SPRINGBOOT中实现文件上传下载的三种解决方案(推荐)

前端:vue2,vue3,vue-cli,webuploader,html5 后端:SpringBoot 数据库:MySQL,Oracle,SQL Server,达梦,人大金仓,国产化数据库 协议:HTTP WebServer:Tomcat,Resin 服务器:Linux,国产化系统 功能:大文件上传,断点续传,秒传,加密传输,加密存储,文件夹上传,文件夹层级结构 技术:支持第三方软件集成, 该说不说,最近这块好像挻火的,今天早上又有网友加我微信,也是想了解一下这块的技术和方案,也不知道这位老哥是从哪里找到

alisky119的博客 2488

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2873

HTPA 32x32d热成像传感器实战指南:从替代MLX90640到精准测温

本文为HTPA 32x32d热成像传感器提供了从硬件连接到精准测温的完整实战指南。针对MLX90640替代需求,详细解析了HTPA传感器的核心优势、IIC通信要点、EEPROM校准数据读取与解析、独特的块数据读取模式,并逐步拆解了五大温度补偿计算流程,旨在帮助开发者克服高开发门槛,实现稳定可靠的非接触式测温应用。

weixin_29279101的博客 313

springboot实现文件的上传与下载

这里仅实现文件的上传与下载服务,完整项目文末有源码 1.先看一下项目结构 上面indexcontroller是用于指向首页的index.html;实际功能由Filecontroller来实现。 2.前端使用模板引擎thymeleaf 3.上传与下载功能 这里提供了单文件上传,多文件上传;下载这三个功能 单文件上传 @RequestMapping(value = "/upload") public String upload(@RequestParam("file") Multipar

lk的博客 2万+

紫光展锐面试——FPGA/IC设计面试面经案例总结

自我介绍;研究生的主要研究方向是什么?为什么想要应聘数字芯片相关的工作?简单介绍下数字IC设计流程。逻辑综合主要做什么?你有实际做过逻辑综合工作吗?你了解SS corner和FF corner吗?综合时应该使用哪个corner?综合时需要考虑hold吗?为什么?提高时钟频率对setup和hold有什么影响?为什么?hvt、rvt/svt、lvt有什么区别?c40、c50是指什么概念?有什么区别?你对EDA工具有过了解吗?

FPGA/MATLAB学习教程/源码/项目合作开发 1561

Java 文件上传与下载

MultipartFile 这个类一般是用来接受前台传过来的文件 Part能获取所有的请求参数的参数名,而Parameter只能获取非文件类型的参数名 Part不能获得普通参数的参数值,只能从 getParameter(String) 获取参数值 想要上传文件到服务器,必须使用Part获得二进制的输入流 Part能获得上传文件的文件大小、文件类型 HttpServletRequest request @RequestPart .........

不懂一休 4万+

YOLO11实战优化:暗光环境检测 | 引入Retinex增强模块与YOLO11联合训练,解决夜间/低照度场景抓拍痛点

本文探讨了暗光环境下目标检测的技术挑战与解决方案。研究发现,传统CNN模型在低照度条件下性能显著下降,主要由于光子数减少导致信噪比降低、目标特征被噪声淹没。针对这一问题,文章提出将可微分光照增强模块嵌入YOLO检测器的技术路线,重点分析了Retinexformer+YOLO11联合方案的优势。 文章对比了YOLO系列模型在暗光场景的表现,指出YOLO11凭借其C3k2模块、无锚检测头和多任务统一骨干网络,在低对比度图像特征提取方面优于前代产品。同时详细介绍了Retinexformer的理论基础和技术创新,包

2601_95807009的博客 206

带洞多边形如何分成凸多边形集合,对多边形进行凸分解?

摘要: 凸分解是计算几何中的经典问题,分为三角化和凸分解两种方法。三角化将带洞多边形转换为简单多边形并分割为三角形,常用算法包括耳剪法、单调多边形三角化等。凸分解则生成更少但更大的凸多边形,常用Hertel-Mehlhorn算法或基于凹点的递归切割。实际应用中建议使用CGAL、Poly2Tri等成熟库处理。三角化适合图形渲染,凸分解更适用于物理引擎和路径规划。关键步骤包括数据校验、选择合适的算法及后处理优化。

插件开发 354

SpringBoot实现文件上传和下载

本文主要讲了文件上传和下载的实现方式。关键是文件下载后端多种实现方式以及前端通过window.open、ajax和axios实现文件下载。

qq_55896432的博客 2万+

linux内核协议栈 TCP选项之SACK选项概述

目录 1SACK概述 1.1 SACK允许选项 1.2 SACK选项 2SACK允许选项的发送 2.1 SYN段发送 2.2 接收SYN段 2.2.1 struct tcp_options_received 2.2.2 tcp_parse_options() 2.3 发送SYN+ACK段 3D-SACK 1SACK概述 标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重...

2731

【springboot项目开发】文件上传与下载

文件的上传和下载功能,是项目开发过程中比较常见的业务需求,我们在客户端被展现的视觉效果通过如下:在项目前端页面的提示下将本地文件加入到浏览器的具体位置,之后浏览器直接将这个图片回显了

m0_65431718的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【File】使用 SpringBoot 实现文件的上传与下载

文件的上传与下载在实际项目中用得挺多,所以,今天就在这里总结下。 这篇博客不仅仅是完成一个文件上传/下载的功能,更重要的是规范编码吧:日志记录、入参/返参校验、方法职责单一等。 开发环境: 1.IDEA 2020.2 2.Maven 3.6.0 3.SpringBoot 2.0.0.RELEASE 1. 单个文件的上传 新建一个 SpringBoot 工程,工程结构图如下: POM 依赖: <dependency> <groupId>org.springframework.bo

sco5282的博客 5277

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringBoot + Vue 实现文件的上传与下载

文章目录1. 前言2. 简单案例2.1 功能需求2.2 开发环境2.3 编写代码2.3.1 上传2.3.1.1 前端2.3.1.2 后端总结 1. 前言 简要地记录下 SpringBoot 与 Vue 实现文件的上传与下载 2. 简单案例 2.1 功能需求 前台使用 ElementUI 的 Upload 组件或者是 Ajax,后台使用 SpringBoot 来实现任意后缀名的文件的上传与下载 2.2 开发环境 IDEA-2019.1 SpringBoot-2.0.2.RELEASE Maven-3.5

菩提小猿的博客 3345

SpringBoot结合MultipartFile类实现文件上传与文件下载

前言 文件上传与文件下载功能是必会的技能。比如:我们在修改头像的时候,需要上传头像;还有就是我们在后台修改商品信息的时候,也需要上传商品图片,文件上传下载应用场景很多,所以才说是必会的技能。 这次结合SpringBoot实现单文件上传,多文件上传以及文件下载。 文件上传到哪里合适? ...

weixin_44176169的博客 7234

关于SpringBoot项目中的文件上传与文件下载的简单实现

概述 文件上传与下载,是程序开发中经常使用到的一个功能,比如: 用户头像、文章封面等需求 博客中发布文章的富文本编辑框插件文件上传功能 … 什么是文件上传?文件上传就是为了共享资源, 一句话:把用户的自己电脑中的文件,通过程序上传到服务器的过程 如何实现 新建一个spring boot工程 pom.xml <dependencies> <dependency> <groupId>org.springframework.boot

cao2509712467的博客 7121

SpringBoot文件上传和下载

SpringBoot文件上传和下载 一、SpringBoot文件上传 1、SpringMVC文件上传 1、Client处理 选择文件 (1)form表单 选择文件 method="post" (2)enctype="multipart/form-data" (3) 准备文件框<input type="file" name="upload"> 2、服务端准备存储上传文件的目录 新建文件夹 项目/webapp/upload文件 3、开发文件上传Controller public

程序员小王的博客 1万+

SpringBoot+Vue+ElementUI实现文件上传与文件下载

SpringBoot+Vue+ElementUI实现文件拖拽点击上传,文件下载

qq_40300227的博客 8112
上一篇: 关于Sql 中 on和where的粗略理解
下一篇: 发个文章怀念一下(六一儿童节)
鳳九~
博客等级 码龄8年 1384粉丝 215原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值