您现在的位置是:首页 > 编程 > 

【Spring Boot】026

2025-07-25 22:53:21
【Spring Boot】026 【Spring Boot】026-文件上传、下载、删除 更新时间:202年5月25日 08点52分 一、单文件上传1、第一步:编写upload.html文件代码语言:javascript代码运行次数:0运行复制<!DOCTYPE html> <html lang="en"> <head> <

【Spring Boot】026

【Spring Boot】026-文件上传、下载、删除

更新时间:202年5月25日 08点52分

一、单文件上传

1、第一步:编写upload.html文件

代码语言:javascript代码运行次数:0运行复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="uploadFile" value="请选择文件">
        <input type="submit" value="上传">
    </form>

</body>
</html>

2、第二步:编写上传接口

代码语言:javascript代码运行次数:0运行复制
package com.zibo.;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@RestController
public class FileUploadController {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
    @PostMapping("upload")
    public String upload(MultipartFile uploadFile, HttpServletRequest request){
        String realPath = request.getSession().getServletContext().getRealPath("/uploadFile/");
        String format = sdf.format(new Date());
        File folder = new File(realPath + format);
        if(!folder.isDirectory()){
            ();
        }
        String oldame = uploadFile.getOriginalFilename();
        String newame = UUID.randomUUID().toString() + oldame.substring(oldame.lastIndexOf("."));
        try {
            (new File(folder,newame));
            return request.getScheme() + "://" + request.getServerame() + ":" + request.getServerPort() + "/uploadFile/" + format + "/" + newame;
        }catch (IOException e){
            e.printStackTrace();
        }
        return "上传失败!";
    }
}

、第三步:运行测试

文件上传
image-2021081615420807
上传成功之后获得地址
image-2021081615416105
访问获得的地址
image-20210816154402115
注意

如果配置了可能无法直接访问静态文件,需要进行响应的调整(见参考文章),我这里为了方便直接把注释了!

参考文章:

【Spring Boot】007-Spring Boot Web开发:静态资源导入、Thymeleaf使用

(其中的“自定义策略”部分)

4、关于上传文件一些细节上的设置

代码语言:javascript代码运行次数:0运行复制
# 是否开启文件上传支持,默认为true
spring.=true
# 文件写入磁盘的阈值,默认为0
spring.file-size-threshold=0
# 文件上传临时保存的位置
spring.location=E:\\temp
# 单个文件最大大小
spring.max-file-size=1MB
# 多文件上传时总最大大小
spring.max-request-size=10MB
# 文件是否延迟解析,默认false
spring.resolve-lazily=false
二、多文件上传

1、第一步:修改 upload.html

代码语言:javascript代码运行次数:0运行复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
    <form action="/uploads" method="post" enctype="multipart/form-data">
        <input type="file" name="uploadFiles" value="请选择文件">
        <input type="submit" value="上传">
    </form>

</body>
</html>

2、第二步:编写对应接口

代码语言:javascript代码运行次数:0运行复制
@PostMapping("uploads")
public String upload(MultipartFile[] uploadFiles, HttpServletRequest request){
	// 遍历 uploadFiles 数组,分别存储即可!
}
三、上传、下载、删除示例

1、Controller

代码语言:javascript代码运行次数:0运行复制
package com.wq.system;

import com.wq.floodservermon.pojo.ApiException;
import com.wq.floodservermon.pojo.Pair;
import com.wq.floodservermon.util.FileUtil;
import slf4j.Slf4j;
import org.util.http.fileupload.IOUtils;
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.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRespe;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.URLEncoder;
import StandardCharsets;

/**
 * 文件 Controller
 *
 * @author dev
 * @date 202//0 16:55
 * @slogan 真正的大师永远怀着一颗学徒的心。——易大师
 */
@RestController
@RequestMapping("/file")
@Slf4j
public class UploadFileController {

    /**
     * 接收前端上传的文件
     *
     * @param file 文件
     * @return 上传后的文件路径 (如:\\uploads\202\0\0\) + 文件名.后缀)
     */
    @PostMapping("/upload")
    public Pair<String, String> upload(MultipartFile file) {
        // 文件上传后的路径
        return FileUtil.saveFile(file);
    }

    @GetMapping("/download")
    public void download(String path, HttpServletRespe respe) {
        // 读取文件
        File file = new File(FileUtil.USER_DIR, path);
        // 从文件路径中获取文件名
        String fileame = FileUtil.getFileame(path);
        // 获取文件输入流
        try (
                FileInputStream is = new FileInputStream(file)
        ) {
            // 解决文件名中文乱码的问题
            respe.setHeader("content-disposition",
                    "attachment;fileame=" + (fileame, StandardCharsets.UTF_8));
            // 设置强制下载不打开
            respe.setContentType("application/force-download");
            // 获取响应输出流
            ServletOutputStream os = respe.getOutputStream();
            // 文件拷贝
            (is, os);
            // 关流方式(优雅)
            (is);
            (os);
        } catch (IOException e) {
            throw new ApiException(e);
        }
    }

    /**
     * 删除文件
     */
    @GetMapping("/delete")
    public Boolean delete(String path) {
        return FileUtil.deleteFile(path);
    }

}

2、文件工具类

代码语言:javascript代码运行次数:0运行复制
package com.wq.floodservermon.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
import java.util.UUID;
import java.util.regex.Pattern;

import com.wq.floodservermon.pojo.Pair;
import com.wq.floodservermon.pojo.ApiException;
import org.apachem.lang.StringUtils;
import org.springframework.MultipartFile;

/**
 * 文件工具类
 *
 * @author dev
 * @date 2022/7/1 001 11:57
 */
public class FileUtil {

    private FileUtil() {
    }

    public static final String USER_DIR = System.getProperty("user.dir");

    public static final String UPLOADS_PATH = StringUtils.join(USER_DIR, File.separator, "uploads", File.separator);

    private static final Integer BUFFER_SIZE = 8192;

    /**
     * 保存文件
     * 文件的相对地址加了多余的反斜杠,为了防止 idea 报错
     *
     * @param file 文件
     * @return 记录原始文件名 + 相对的文件路径(数据库保存的文件地址:时间文件夹(如:\\uploads\202\0\0\) + 文件名.后缀)
     */
    public static Pair<String, String> saveFile(File file) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(StringUtils.join("yyyy", File.separator, "MM", File.separator, "dd"));
        // 文件夹路径
        String finalPath = StringUtils.join(UPLOADS_PATH, simpleDateFormat.format(new Date()), File.separator);
        // file
        File dir = new File(finalPath);
        // 如果文件夹不存在,则创建
        if (!()) {
            boolean mkdirs = ();
            if (!mkdirs) {
                throw new ApiException(50000, "创建文件夹失败");
            }
        }
        // 记录原始文件名
        String originalame = file.getame();
        // 文件重命名
        String fileame =
                StringUtils.join(finalPath, UUID.randomUUID().toString(), file.getame().substring(file.getame().lastIndexOf(".")));
        // 保存文件
        boolean renameTo = file.renameTo(new File(fileame));
        if (!renameTo) {
            throw new ApiException(50000, "保存文件失败");
        }
        file.deleteOnExit();
        LogUtility.uploadFile(StringUtils.join("上传文件:", originalame, ",保存路径:", fileame.substring(FileUtil.USER_DIR.length())));
        // 直接返回相对路径,直接存入数据库即可
        return (originalame, fileame.substring(FileUtil.USER_DIR.length()));
    }

    /**
     * 保存文件
     *
     * @param multipartFile 文件
     * @return 保存后的相对路径
     */
    public static Pair<String, String> saveFile(MultipartFile multipartFile) {
        try {
            return saveFile(multipartFileToFile(multipartFile));
        } catch (ullPointerException e) {
            throw new ApiException(50000, "保存文件失败:" + e.getMessage());
        }
    }

    /**
     * 根据相对路径删除文件,示例地址加了多余的斜杠,实际使用时注意
     *
     * @param path 数据库保存的文件地址:时间文件夹(如:\\uploads\202\0\0\) + 文件名.后缀
     *             文件上传得到的完整地址:D:\MyFile\GitHub\flood-server\\uploads\202\0\0\269889b4-59d-48b5-9fb-049e621062d5.xmind
     *             UPLOADS_PATH:D:\MyFile\GitHub\flood-server\\uploads\
     *             数据库保存的文件地址:\\uploads\202\0\0\269889b4-59d-48b5-9fb-049e621062d5.xmind
     * @return 是否删除成功
     */
    public static Boolean deleteFile(String path) {
        String originalPath = path;
        // 替换掉“\\uploads\”
        path = path.replace("\\uploads\\", "");
        // 验证路径的合法性:(策略)验证是否是以四位数年份开头即可
        String pattern = "^\\d{4}";
        if ((pattern, path)) {
            throw new ApiException("无效的文件路径:" + originalPath);
        }
        // 创建 File
        File file = new File(StringUtils.join(UPLOADS_PATH, path));
        // 文件删除日志
        LogUtility.deleteFile(path);
        // 删除文件
        return file.delete();
    }

    /**
     * 将 multipartFile 转换成  临时 file 文件.(该临时文件使用完记得 delete掉.)
     *
     * @param multipartFile multipartFile
     * @return 临时的 file 文件.
     */
    public static File multipartFileToFile(MultipartFile multipartFile) {
        if (multipartFile == null) {
            return null;
        }
        File file = new File(Objects.requireonull(multipartFile.getOriginalFilename()));
        try (
                OutputStream os = new FileOutputStream(file);
                InputStream inputStream = multipartFile.getInputStream()
        ) {
            int bytesRead;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inputStream.read(buffer, 0, BUFFER_SIZE)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return file;
    }

    /**
     * 从文件路径中获取文件名
     *
     * @param path 文件路径
     * @return 文件名
     */
    public static String getFileame(String path) {
        return path.substring(path.lastIndexOf(File.separator) + 1);
    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-05-25,如有侵权请联系 cloudcommunity@tencent 删除springbootimport文件上传数据库

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1198704.html

相关标签:无
上传时间: 2025-07-23 12:34:04

上一篇:【Spring Boot】027

下一篇:【Spring Boot】025

留言与评论(共有 18 条评论)
本站网友 山东菏泽白癜风医院
23分钟前 发表
第一步:修改 upload.html代码语言:javascript代码运行次数:0运行复制<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <form action="/uploads" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFiles" value="请选择文件"> <input type="submit" value="上传"> </form> </body> </html>2
本站网友 北京女王
29分钟前 发表
实际使用时注意 * * @param path 数据库保存的文件地址:时间文件夹(如:\\uploads\202\0\0\) + 文件名.后缀 * 文件上传得到的完整地址:D
本站网友 田七花的功效
26分钟前 发表
""); // 验证路径的合法性:(策略)验证是否是以四位数年份开头即可 String pattern = "^\\d{4}"; if ((pattern
本站网友 上海长城宽带电话
11分钟前 发表
我这里为了方便直接把注释了!参考文章:【Spring Boot】007-Spring Boot Web开发:静态资源导入
本站网友 qq性别修改器
2分钟前 发表
删除示例1
本站网友 陕e00000
16分钟前 发表
如有侵权请联系 cloudcommunity@tencent 删除前往查看springbootimport文件上传数据库
本站网友 视频直播
21分钟前 发表
StandardCharsets.UTF_8)); // 设置强制下载不打开 respe.setContentType("application/force-download"); // 获取响应输出流 ServletOutputStream os = respe.getOutputStream(); // 文件拷贝 (is
本站网友 产妇鸽子汤的做法
2分钟前 发表
"保存文件失败"); } file.deleteOnExit(); LogUtility.uploadFile(StringUtils.join("上传文件:"
本站网友 广州军区陆军总医院
22分钟前 发表
第一步:修改 upload.html代码语言:javascript代码运行次数:0运行复制<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <form action="/uploads" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFiles" value="请选择文件"> <input type="submit" value="上传"> </form> </body> </html>2
本站网友 西安翻译公司
15分钟前 发表
第二步:编写上传接口代码语言:javascript代码运行次数:0运行复制package com.zibo.; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import SimpleDateFormat; import java.util.Date; import java.util.UUID; @RestController public class FileUploadController { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); @PostMapping("upload") public String upload(MultipartFile uploadFile
本站网友 邓州市房价
10分钟前 发表
多文件上传1
本站网友 舟山沈家门
26分钟前 发表
"attachment;fileame=" + (fileame
本站网友 海外华人网
18分钟前 发表
"创建文件夹失败"); } } // 记录原始文件名 String originalame = file.getame(); // 文件重命名 String fileame = StringUtils.join(finalPath
本站网友 金宝贝婴儿游泳馆
8分钟前 发表
——易大师 */ @RestController @RequestMapping("/file") @Slf4j public class UploadFileController { /** * 接收前端上传的文件 * * @param file 文件 * @return 上传后的文件路径 (如:\\uploads\202\0\0\) + 文件名.后缀) */ @PostMapping("/upload") public Pair<String
本站网友 宝鸡中学贴吧
30分钟前 发表
第二步:编写上传接口代码语言:javascript代码运行次数:0运行复制package com.zibo.; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import SimpleDateFormat; import java.util.Date; import java.util.UUID; @RestController public class FileUploadController { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); @PostMapping("upload") public String upload(MultipartFile uploadFile
本站网友 香江花园
26分钟前 发表
第二步:编写对应接口代码语言:javascript代码运行次数:0运行复制@PostMapping("uploads") public String upload(MultipartFile[] uploadFiles
本站网友 鸡爪的营养价值
6分钟前 发表
分别存储即可! }三