Springboot MultipartFile文件上传与下载的实现示例

 更新时间:2023年08月16日 15:02:44   作者:掐指一算乀缺钱  
在Spring Boot项目中,可以使用MultipartFile类来处理文件上传和下载操作,本文就详细介绍了如何使用,具有一定的参考价值,感兴趣的可以了解一下

yml文件配置是否可以上传及上传附件大小

  servlet:
    multipart:
      # 允许文件上传
      enabled: true
      # 单个文件大小
      max-file-size: 20MB
      # 设置总上传的文件大小
      max-request-size: 50MB
/**
     * @param files
     * @param request
     * @Description 上传文件
     * @Throws
     * @Return java.util.List
     * @Date 2023-08-02 12:11:02
     * @Author WangKun
     */
    @PostMapping("/upload")
    public List<JSONObject> upload(@RequestParam("uploadFiles") MultipartFile[] files, HttpServletRequest request) {
        List<JSONObject> list = new ArrayList<>();
        for (MultipartFile file : files) {  //循环保存文件
            JSONObject result = new JSONObject();
            String msg = "";
            //判断上传文件格式
            String fileType = file.getContentType();
            // 要上传的目标文件存放的绝对路径
            String path = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "imags";
            //文件名
            String fileOldName = file.getOriginalFilename();
            if (StringUtils.isNotBlank(fileOldName) && StringUtils.isNotEmpty(fileOldName)
              && StringUtils.isNotBlank(fileType) && StringUtils.isNotEmpty(fileType)
            ) {
                //获取文件后缀名
                String suffixName = fileOldName.substring(fileOldName.lastIndexOf("."));
                //重新生成文件名
                String fileNewName = UUID.randomUUID() + suffixName;
                // 上传
                if (FileUtils.upload(file, path, fileNewName)) {
                    // 保存数据库信息
                    String id = addAnnex(fileNewName, fileOldName, path, fileType, file.getSize());
                    if (StringUtils.isNotBlank(id) && StringUtils.isNotEmpty(id)) {
                        result.put("fileName", fileNewName);
                        result.put("id", id);
                        msg = "文件上传成功";
                    }
                } else {
                    msg = "文件上传失败";
                }
            }else{
                msg = "文件名或文件类型为空";
            }
            result.put("msg", msg);
            list.add(result);
        }
        return list;
    }

文件上传到了:\target\classes\imags中

下载:

 /**
     * @param id
     * @param response
     * @Description 文件下载
     * @Throws
     * @Return java.util.List<com.alibaba.fastjson2.JSONObject>
     * @Date 2023-08-02 13:24:41
     * @Author WangKun
     */
    @GetMapping("/download")
    public void download(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response) {
        Annex annex = annexService.selectAnnex(id);
        String fileName = annex.getFileNewName();
        String charsetCode = String.valueOf(StandardCharsets.UTF_8);
        try {
            File file = new File(annex.getFilePath() + File.separator + fileName);
            //中文乱码解决
            String type = request.getHeader("User-Agent").toLowerCase();
            // 字符编码格式
            if (type.indexOf("firefox") > 0 || type.indexOf("chrome") > 0) {
                //谷歌或火狐
                fileName = new String(fileName.getBytes(charsetCode), "iso8859-1");
            } else {
                //IE
                fileName = URLEncoder.encode(fileName, charsetCode);
            }
            // 设置响应的头部信息
            response.setHeader("content-disposition", "attachment;filename=" + fileName);
            // 设置响应内容的类型
            response.setContentType(FileUtils.fileContentType(fileName) + "; charset=" + charsetCode);
            // 设置响应内容的长度
            response.setContentLength((int) file.length());
            // 输出
            FileUtils.outStream(Files.newInputStream(file.toPath()), response.getOutputStream());
        } catch (Exception e) {
            log.error("文件下载异常{}", e.getMessage());
        }
    }

文件工具类:

/**
 * @Description 文件上传工具
 * @Author WangKun
 * @Date 2023/8/2 10:28
 * @Version
 */
@Slf4j
public class FileUtils {
    /**
     * @param file
     * @param path
     * @param fileName
     * @Description 保存文件
     * @Throws
     * @Return boolean
     * @Date 2023-08-02 12:10:39
     * @Author WangKun
     */
    public static boolean upload(MultipartFile file, String path, String fileName) {
        String realPath = path + "\\" + fileName;
        File dest = new File(realPath);
        //判断文件父目录是否存在
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdir();
        }
        try {
            //保存文件
            file.transferTo(dest);
            return true;
        } catch (IllegalStateException | IOException e) {
            log.error("文件上传{} 异常", e.getMessage(),e);
            e.printStackTrace();
            return false;
        }
    }
    /**
     * @param name
     * @Description 设置响应头部信息
     * @Throws
     * @Return java.lang.String
     * @Date 2023-08-02 13:39:15
     * @Author WangKun
     */
    public static String fileContentType(String name) {
        String result = "";
        String fileType = name.toLowerCase();
        if (fileType.endsWith(".png")) {
            result = "image/png";
        } else if (fileType.endsWith(".gif")) {
            result = "image/gif";
        } else if (fileType.endsWith(".jpg") || fileType.endsWith(".jpeg")) {
            result = "image/jpeg";
        } else if (fileType.endsWith(".svg")) {
            result = "image/svg+xml";
        } else if (fileType.endsWith(".doc")) {
            result = "application/msword";
        } else if (fileType.endsWith(".xls")) {
            result = "application/x-excel";
        } else if (fileType.endsWith(".zip")) {
            result = "application/zip";
        } else if (fileType.endsWith(".pdf")) {
            result = "application/pdf";
        } else if (fileType.endsWith(".mpeg")) { //MP3
            result = "audio/mpeg";
        } else if (fileType.endsWith(".mp4")) {
            result = "video/mp4";
        } else if (fileType.endsWith(".plain")) {
            result = "text/plain";
        } else if (fileType.endsWith(".html")) {
            result = "text/html";
        } else if (fileType.endsWith(".json")) {
            result = "application/json";
        } else{
            result = "application/octet-stream";
        }
        return result;
    }
    /**
     * @param is
     * @param os
     * @Description 文件下载输出
     * @Throws
     * @Return void
     * @Date 2023-08-02 13:40:47
     * @Author WangKun
     */
    public static void outStream(InputStream is, OutputStream os) {
        try {
            byte[] buffer = new byte[10240];
            int length = -1;
            while ((length = is.read(buffer)) != -1) {
                os.write(buffer, 0, length);
                os.flush();
            }
        } catch (Exception e) {
            log.error("文件下载{} 异常", e.getMessage(),e);
        } finally {
            try {
                os.close();
                is.close();
            } catch (IOException e) {
                log.error("关闭流{} 异常", e.getMessage(),e);
                e.printStackTrace();
            }
        }
    }
}

到此这篇关于Springboot MultipartFile文件上传与下载的实现示例的文章就介绍到这了,更多相关Springboot MultipartFile文件上传与下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring MVC之mvc:resources如何处理静态资源

    Spring MVC之mvc:resources如何处理静态资源

    这篇文章主要介绍了Spring MVC之mvc:resources如何处理静态资源问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • java中request常用方法小结

    java中request常用方法小结

    这篇文章主要介绍了java中request常用方法小结,需要的朋友可以参考下
    2014-10-10
  • SpringBoot整合Swagger框架过程解析

    SpringBoot整合Swagger框架过程解析

    这篇文章主要介绍了SpringBoot整合Swagger框架过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java中关键字synchronized的使用方法详解

    Java中关键字synchronized的使用方法详解

    synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块,下面这篇文章主要给大家介绍了关于Java中synchronized使用的相关资料,需要的朋友可以参考下
    2021-08-08
  • Elasticsearch QueryBuilder简单查询实现解析

    Elasticsearch QueryBuilder简单查询实现解析

    这篇文章主要介绍了Elasticsearch QueryBuilder简单查询实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 优化MyBatis配置文件中的配置详解

    优化MyBatis配置文件中的配置详解

    这篇文章主要介绍了优化MyBatis配置文件中的配置详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Flink状态和容错源码解析

    Flink状态和容错源码解析

    这篇文章主要为大家介绍了Flink状态和容错源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 深入浅析Spring 的aop实现原理

    深入浅析Spring 的aop实现原理

    AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。本文给大家介绍Spring 的aop实现原理,感兴趣的朋友一起学习吧
    2016-03-03
  • MyBatis中${} 和 #{} 有什么区别小结

    MyBatis中${} 和 #{} 有什么区别小结

    ${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的 SQL 中,但它们区别却是很大的,今天通过本文介绍下MyBatis中${} 和 #{} 有什么区别,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • 基于Spring中各个jar包的作用及依赖(详解)

    基于Spring中各个jar包的作用及依赖(详解)

    下面小编就为大家带来一篇基于Spring中各个jar包的作用及依赖(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论