当前位置: 首页 > web >正文

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

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

具体如下:

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

        <!-- 文件上传工具类 --><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相关配置

文件保存位置:

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

2️⃣新增访问映射配置


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 注册表*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {/*** 配置资源映射* 意思是:如果访问的资源路径是以“/model/”开头的,* 就映射到本机的“D:/home/software/data/upload/”这个文件夹内,然后访问资源* 注意:D:/home/software/data/upload/ 地址后面的 / 必须添加*/registry.addResourceHandler("/model/**").addResourceLocations("file:" + uploadedFolder);}/*** 跨域配置*/@Beanpublic CorsFilter corsFilters() {CorsConfiguration config = new CorsConfiguration();// 设置访问源地址config.addAllowedOriginPattern("*");// 设置访问源请求头config.addAllowedHeader("*");// 设置访问源请求方法config.addAllowedMethod("*");// 有效期 1800秒config.setMaxAge(1800L);// 添加映射路径,拦截一切请求UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);// 返回新的CorsFilterreturn new CorsFilter(source);}
}

3、具体代码实现

    /*** 上传文件夹*/@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);// 将文件名称和原始文件名称存入mapmap.put("newFileName", fileNames);map.put("originalFilename", file.getOriginalFilename());try {// 将文件保存到目标目录file.transferTo(Paths.get(targetDir, fileNames));// 将文件路径存入mapmap.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、实现上传

结果返回

{"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地址

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

http://www.xdnf.cn/news/2709.html

相关文章:

  • 高级数据库对象全面解析:视图、存储过程与触发器
  • Express.js 框架教程:从入门到精通
  • 【“星瑞” O6 评测】 — llm CPU部署对比高通骁龙CPU
  • T-BOX应用 NXP S32K148控芯片搭配 SD NAND(嵌入式SD卡)存储的完美结合
  • 设计模式(状态模式)
  • 【力扣刷题实战】丢失的数字
  • vue代码规范管理
  • BeeWorks企业内部即时通讯软件支持国产化,已在鸿蒙系统上稳定运行
  • 【Altium】自定义菜单显示名称
  • C++23 std::bind_back:一种调用包装器 (P2387R3)
  • Matlab自学笔记五十二:变量名称:检查变量名称是否存在或是否与关键字冲突
  • Nacos-3.0.0适配PostgreSQL数据库
  • 互容是什么意思?
  • python+selenium实现淘宝商品数据半自动查询
  • pg数据库删除模式
  • CVE-2024-3431 EyouCMS 反序列化漏洞研究分析
  • 道可云人工智能每日资讯|“人工智能科技体验展”在中国科学技术馆举行
  • 【原创】从s3桶将对象导入ES建立索引,以便快速查找文件
  • 基于 MeloTTS.cpp 的轻量级的纯 C++ 文本转语音(TTS)库
  • 相机-IMU联合标定:相机-IMU外参标定
  • 【二分查找】寻找峰值(medium)
  • 学生管理系统审计
  • 从零开始的二三维CAD软件开发: 系列经验分享-写在开头
  • TensorFlow深度学习实战——基于循环神经网络的文本生成模型
  • ExoPlayer 中的 Timeline、Period 和 Window
  • shell--数组、正则表达式RE
  • Flutter 学习之旅 之 flutter 作为 module ,在 Android 端主动唤起 Flutter 开发的界面 简单的整理
  • gitgitgit!
  • 关于CentOS7学习过程中遇到的一些问题
  • JAVA-StringBuilder使用方法