springboot项目文件上传到服务器本机,返回访问地址

文件上传到服务器本机,然后给出访问地址:

具体如下:

1、添加必要的工具类依赖

XML 复制代码
        <!-- 文件上传工具类 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.18.0</version>
        </dependency>

2、新增配置

1️⃣新增yml相关配置

文件保存位置:

XML 复制代码
# 文件相关
file:
  #后台服务模型目录
  modelPath: D:/home/software/data/upload/

2️⃣新增访问映射配置

java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 通用配置
 *
 * @author xjs
 */
@Configuration
public class WebResourcesConfig implements WebMvcConfigurer {


    /**
     * 上传文件夹
     */
    @Value("${file.modelPath}")
    private String uploadedFolder;

    /**
     * 添加资源处理程序
     *
     * @param registry 注册表
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * 配置资源映射
         * 意思是:如果访问的资源路径是以"/model/"开头的,
         * 就映射到本机的"D:/home/software/data/upload/"这个文件夹内,然后访问资源
         * 注意:D:/home/software/data/upload/ 地址后面的 / 必须添加
         */
        registry.addResourceHandler("/model/**")
                .addResourceLocations("file:" + uploadedFolder);
    }

    /**
     * 跨域配置
     */
    @Bean
    public CorsFilter corsFilters() {
        CorsConfiguration config = new CorsConfiguration();
        // 设置访问源地址
        config.addAllowedOriginPattern("*");
        // 设置访问源请求头
        config.addAllowedHeader("*");
        // 设置访问源请求方法
        config.addAllowedMethod("*");
        // 有效期 1800秒
        config.setMaxAge(1800L);
        // 添加映射路径,拦截一切请求
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        // 返回新的CorsFilter
        return new CorsFilter(source);
    }
}

3、具体代码实现

java 复制代码
    /**
     * 上传文件夹
     */
    @Value("${file.modelPath}")
    private String uploadedFolder;

    @ApiOperation("上传文件-返回访问地址")
    @PostMapping("/uploadFiles")
    public ResponseEntity<Object> uploadFiles(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
        // 获取当前时间
        Date nowDate = new Date( );
        // 定义日期格式
        SimpleDateFormat ftDdy = new SimpleDateFormat ("yyyy/MM/dd");
        // 定义时间格式
        SimpleDateFormat ftTime = new SimpleDateFormat ("HHmmss");

        // 创建一个HashMap用于存储文件信息
        HashMap<String, Object> map = new HashMap<>();
        // 判断文件是否为空
        if (file.isEmpty()) {
            // 如果文件为空,返回错误信息
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("文件不能为空!");
        }
        // 获取当前日期
        String directory = ftDdy.format(nowDate);
        // 获取当前时间
        String fileNames = ftTime.format(nowDate) + "_" + file.getOriginalFilename();
        // 打印文件名称
        log.info("文件名称: {}", fileNames);
        // 获取目标目录
        String targetDir = Paths.get(uploadedFolder, directory).toString();
        // 打印目标目录
        log.info("目标目录: {}", targetDir);
        // 创建目标目录
        createDirectoriesIfNotExists(targetDir);
        // 将文件名称和原始文件名称存入map
        map.put("newFileName", fileNames);
        map.put("originalFilename", file.getOriginalFilename());
        try {
            // 将文件保存到目标目录
            file.transferTo(Paths.get(targetDir, fileNames));
            // 将文件路径存入map
            map.put("filePath", targetDir + "\\" + fileNames);
            //http 协议 ://127.0.0.1 ip地址 :18080 端口号 / 文件目录(/model/2025/04/30/xxx.xxx)
            String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/model/" + directory + "/" + fileNames;
            log.info("文件上传,访问URL:" + url);
            map.put("url", url);
            return ResponseEntity.status(HttpStatus.OK).body(map);
        } catch (IOException e) {
            log.error("文件上传失败", e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败!");
        }
    }

4、实现上传

结果返回

bash 复制代码
{
    "filePath": "D:\\home\\software\\data\\upload\\2025\\04\\28\\110940_RC.gif",
    "newFileName": "110940_RC.gif",
    "originalFilename": "RC.gif",
    "url": "http://192.168.5.88:18080/model/2025/04/28/110940_RC.gif"
}

然后即可在浏览器中访问url地址

至此即可实现上传获取访问地址!

相关推荐
头发还在的女程序员7 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats7 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123458 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥10 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.10 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔11 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊12 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
韩楚风13 小时前
【参天引擎】一次宕机后的数据恢复,让我把 Cantian 持久化与恢复的六大机制全搞明白了
服务器·网络·数据库·分布式·mysql·架构·cantian
景同学13 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端
kirs_ur14 小时前
SSD 安全特性 — 加密与 TCG Opal
服务器·网络·安全