Spring Boot--文件上传和下载

文件上传和下载

前言

文件上传是指本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览和下载的过程

文件上传的前提调节:

必须将file的流以formdata的形式传参,并且必须以post请求提交

文件上传

1、以MultipartFile 接口流文件,流的名称需要和前台传过来的名称对应上

2、获取到文件名称截取后缀

3、为了放置文件名重复使用uuid来随机生成id+后缀

4、判断转存路径中是否有这个文件夹如果没有就创建

5、将文件存储到转存的目录中

文件下载

1、通过输入流获取到文件

2、通过输出流输出文件

3、判断文件读取是否完成,如果为-1就是读取完成

4、读取陈工后写入到输出流并返回

5、关闭资源

java 复制代码
package com.example.ruiji_demo.controller;

import com.example.ruiji_demo.common.R;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @author jitwxs
 * @date 2024年04月03日 18:17
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommponContreller {
//    获取转存的地址
    @Value("${reggie.path}")
    private String basePath;

//    定义上传文件的接口
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
        String originalFilename = file.getOriginalFilename();
//        截取后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

//        使用uuid重新生成文件名,放置文件名称重复
        String filName = UUID.randomUUID().toString()+suffix;

//        判断目录是否存在如果不存在就创建目录
        File dir = new File(basePath);
        if(!dir.exists()){
            dir.mkdir();
        }
        try {
//            将临时文件转存到指定位置
            file.transferTo(new File(basePath+filName));
        } catch (IOException e){
            e.printStackTrace();
        }
        return R.success("上传成功");
    }

//    定义下载接口
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){
        try{
//            输入流,通过输入流读取文件内容
            FileInputStream fileInputstream = new FileInputStream(new File(basePath+name));
//            输出流,通过输出流将文件写入浏览器,在浏览器中展示图片
            ServletOutputStream outputStream = response.getOutputStream();

//            返回的文件格式
//            response.setContentType("image/jpeg");
//            判断文件的长度
            int len = 0;
            byte[] bytes = new byte[1024];
            while((len = fileInputstream.read(bytes)) != -1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }

//            关闭资源
            outputStream.close();
            fileInputstream.close();

        }catch(Exception e){
            e.printStackTrace();
        }
    }

}
相关推荐
马剑威(威哥爱编程)1 分钟前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
Gauss松鼠会2 分钟前
【GaussDB】破除gaussdb ugin索引支持中文模糊查询的迷思-字符序
java·运维·服务器·网络·数据库·gaussdb·经验总结
IT研究室9 分钟前
最新计算机毕业设计选题推荐-基于spring boot的心桥·心理健康综合服务平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
1360967572327 分钟前
一台 4 核 8G 已经跑了 6 个站点,我是怎么把第 7 个塞进去的
后端
对象存储与RustFS28 分钟前
JuiceFS + 对象存储:把 S3 变成 POSIX 文件系统实测
后端·rust·开源
Sarvartha34 分钟前
Object 类
java·开发语言
知守观37 分钟前
feign-core 就在依赖树里,运行时却找不到类:一次 provided scope 引发的启动失败排查
java·spring cloud·maven
她的男孩37 分钟前
企业接口照样拦得住:独立 Flyway、@RequiresFeature 与离线许可证
java·spring boot·后端
十年Java程序媛38 分钟前
Lambda 与函数式接口|别只会复制 ()->{},底层规则和坑一次性讲清
java·spring boot·后端
yunwei3739 分钟前
eBPF 入门开发实践教程一:Hello World,基本框架和开发流程
linux·后端·性能优化