【SpringBoot】39、SpringBoot上传文件至项目resources目录下

【SpringBoot】39、SpringBoot上传文件至项目resources目录下当我们没有搭建单独的文件服务器时,我们需要将文件上传至项目目录下,今天我们就学习如何上传文件到项目的resources目录下一、引入依赖<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></depende

大家好,又见面了,我是你们的朋友全栈君。

当我们没有搭建单独的文件服务器时,我们需要将文件上传至项目目录下,今天我们就学习如何上传文件到项目的resources目录下

一、引入依赖

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.3</version>
</dependency>

文件上传,就会涉及到 IO 操作,我们需要引入以上依赖

二、配置文件

spring:
  # 上传文件
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB

配置上传文件的最大值:

  • spring.servlet.multipart.max-file-size,限制单个文件的最大值
  • spring.servlet.multipart.max-request-size,限制上传的多个文件的总大小

三、上传工具类

package com.asurplus.common.utils;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.net.InetAddress;
import java.util.UUID;

/** * 文件上传 * * @author YangXiuTeng * @date Jun 1, 2015 */
@Component
public class UploadFileUtil { 
   

	/** * 项目端口 */
    @Value("${server.port}")
    public String port;

	/** * 项目路径 */
    @Value("${server.servlet.context-path}")
    public String contextPath;

	/** * 上传文件 * * @param multipartFile 文件对象 * @param dir 上传目录 * @return */
    public ResponseResult uploadFile(MultipartFile multipartFile, String dir) { 
   
        try { 
   
            if (multipartFile.isEmpty()) { 
   
                return ResponseResult.error("请选择文件");
            }
            // 获取文件的名称
            String originalFilename = multipartFile.getOriginalFilename();
            // 文件后缀 例如:.png
            String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            // uuid 生成文件名
            String uuid = String.valueOf(UUID.randomUUID());
            // 根路径,在 resources/static/upload
            String basePath = ResourceUtils.getURL("classpath:").getPath() + "static/upload/" + (StringUtils.isNotBlank(dir) ? (dir + "/") : "");
            // 新的文件名,使用uuid生成文件名
            String fileName = uuid + fileSuffix;
            // 创建新的文件
            File fileExist = new File(basePath);
            // 文件夹不存在,则新建
            if (!fileExist.exists()) { 
   
                fileExist.mkdirs();
            }
            // 获取文件对象
            File file = new File(basePath, fileName);
            // 完成文件的上传
            multipartFile.transferTo(file);
            // 返回绝对路径
            return ResponseResult.success("上传成功", "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + port + contextPath + "/upload/" + fileName);
        } catch (Exception e) { 
   
            e.printStackTrace();
        }
        return ResponseResult.error("上传失败");
    }
}

  • 我们由于需要在工具类中获取项目端口及上下文路径,所以我们使用注解 @Component
  • 我们上传的根目录在:resources/static/upload
  • 文件名,我们使用了 uuid 作为新的文件名,保证文件不会被覆盖
  • 我们返回的路径是绝对路径,在实际的生成环境中,建议使用相对路径
  • ResponseResult 是我们自定义的统一返回对象,表示成功还是失败

四、上传调用

  • 1、注入上传工具类
@Autowired
private UploadFileUtil uploadFileUtil;
  • 2、上传 API
/** * 上传文件 * <p> * Ajax方式上传文件 * * @return */
@PostMapping("uploadFileAjax")
@ResponseBody
public ResponseResult uploadFileAjax(HttpServletRequest request) { 
   
    MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
    MultipartFile file = multiRequest.getFile("files");
    String dir = request.getHeader("Minio-dir");
    return uploadFileUtil.uploadFile(file, dir);
}
  • 3、上传调用

Html

<p>ajax提交</p>
<hr>
<div style="height: 200px;width: 200px;position: relative;border: 1px #e2e2e2 solid">
    <input type="file" accept="image/*" id="imgUpload" style="position: absolute;left: 0;top: 0;opacity: 0;filter: alpha(opacity=0);height: 100%;width: 100%;z-index: 99">
    <img src="" alt="" id="picImg" style="height: 100%;width: 100%;position: absolute;left: 0;top: 0;">
</div>

JavaScript

$('#imgUpload').change(function () { 
   
    var formData = new FormData();
    formData.append("files", $("#imgUpload")[0].files[0]);
    var index = layer.load();
    $.ajax({ 
   
        type : "POST",
        cache: false,
        dataType: "json",
        data : formData,
        processData :  false,
        contentType :  false,
        url: baseUrl + 'uploadFileAjax',
        success:function(res){ 
   
            layer.close(index);
            layer.msg(res.msg);
            if(200 == res.code){ 
   
                $('#picImg').attr('src',res.data);
            }
        },
        error:function() { 
   
            layer.close(index);
            layer.msg("服务器异常!");
        }
    });
});

五、上传测试

上传元素
点击上传

上传成功
图片上传成功,转到上传目录:

上传目录
成功上传至项目的 resources/static/upload/ 目录下

如您在阅读中发现不足,欢迎留言!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130856.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月13日 上午11:00
下一篇 2022年6月13日 上午11:00


相关推荐

  • ▲ Android 自定义 Loading加载动画

    ▲ Android 自定义 Loading加载动画

    2021年3月12日
    134
  • 吞食鱼2(FeedingFrenzyTwo) 修改器[通俗易懂]

    吞食鱼2(FeedingFrenzyTwo) 修改器[通俗易懂]童年回忆系列。小时候特别喜欢玩这类游戏,软件不大,很慢的网速也不会下载太久,然后对配置要求不高,很破的电脑也可以玩得很开心。不过也有糟心的时候啊,大鱼太多,无数次死于挑战咬梭子鱼的尾巴……今年最后一天

    2022年7月1日
    22
  • 什么是多态?如何实现?只看这一篇就够了

    什么是多态?如何实现?只看这一篇就够了1 多态的概念 1 1 概念多态的概念 通俗来说 就是多种形态 具体点就是去完成某个行为 当不同的对象去完成时会产生出不同的状态 2 多态的定义及实现 2 1 多态的构成条件多态是在不同继承关系的类对象 去调用同一函数 产生了不同的行为 那么在继承中要构成多态还有两个条件 必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数 且派生类必须对基类的虚函数进行重写 2 2

    2026年3月19日
    1
  • 华三交换机配置access命令_H3C交换机配置基本命令详解

    华三交换机配置access命令_H3C交换机配置基本命令详解H3C交换机配置基本命令详解随着移动互联网趋势加快以及智能终端的快速普及,WLAN应用需求在全球保持高速增长态势。下面是小编整理的关于H3C交换机配置基本命令详解,希望大家认真阅读!1、配置主机名[H3C]systemnameH3C2、配置console口密码#进入系统视图。system-view#进入AUX用户界面视图。[H3C]user-interfaceaux0#设置通过Con…

    2022年6月20日
    201
  • mysql nvl2 函数_Oracle nvl(),nvl2()函数介绍

    mysql nvl2 函数_Oracle nvl(),nvl2()函数介绍NVL 函数 Oracle PLSQL 中的一个函数 格式为 NVL string1 replace with 功能 如果 string1 为 NULL 则 NVL 函数返回 replace with 的值 否则返回 string1 的值 注意事项 string1 和 replace with 必须为同一数据类型 除非显示的使用 TO CHAR 函数 例 NVL TO CHAR numeric column some

    2026年3月17日
    1
  • 反掩码的作用是什么?通配符掩码的作用是什么?—Vecloud[通俗易懂]

    反掩码的作用是什么?通配符掩码的作用是什么?—Vecloud[通俗易懂]反掩码即路由器使用的通配符掩码与源或目标地址一起来分辨匹配的地址范围,跟子网掩码刚好相反。它像子网掩码告诉路由器IP地址的哪一位属于网络号一样,通配符掩码告诉路由器为了判断出匹配,它需要检查IP地址中的多少位。这个地址掩码对使我们可以只使用两个32位的号码来确定IP地址的范围。这是十分方便的,因为如果没有掩码的话,你不得不对每个匹配的IP客户地址加入一个单独的访问列表语句。这将造成很多额外的输入和路由器大量额外的处理过程。所以地址掩码对相当有用。在子网掩码中,将掩码的一位设成1表示IP地址对应的位.

    2022年7月19日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号