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

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

相关推荐
十八旬18 分钟前
苍穹外卖项目实战(日记十)-记录实战教程及问题的解决方法-(day3-2)新增菜品功能完整版
java·开发语言·spring boot·mysql·idea·苍穹外卖
鞋尖的灰尘32 分钟前
springboot-事务
java·后端
银迢迢39 分钟前
SpringCloud微服务技术自用笔记
java·spring cloud·微服务·gateway·sentinel
xiaok42 分钟前
阿里云服务器上安装了nginx,它配置文件中的localhost是不是指的就是阿里云服务器的公网ip
服务器
用户0332126663671 小时前
Java 将 CSV 转换为 Excel:告别繁琐,拥抱高效数据处理
java·excel
这周也會开心1 小时前
Java-多态
java·开发语言
渣哥1 小时前
揭秘!Java反射机制到底是什么?原来应用场景这么广!
java
叫我阿柒啊1 小时前
Java全栈开发实战:从Spring Boot到Vue3的项目实践
java·spring boot·微服务·性能优化·vue3·全栈开发
2401_858286111 小时前
OS26.【Linux】进程程序替换(下)
linux·运维·服务器·开发语言·算法·exec·进程
CPU NULL1 小时前
Spring拦截器中@Resource注入为null的问题
java·人工智能·后端·spring