SpringBoot中static文件下的js访问不到--HTML页面

本文提供了一个Spring Boot项目中配置静态资源映射的具体实现方案。通过继承`WebMvcConfigurerAdapter`并覆盖`addResourceHandlers`方法,可以将所有对/static/**的请求映射到classpath:/static/目录下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

您是否改了application.properties(application.yml)或者不停更改引入方式,还是不行。。。

话不多说上代码!!!

package com.szxs.util;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //将所有/static/** 访问都映射到classpath:/static/ 目录下
                    registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }
}

 

 

<think>我们正在回答用户的问题:如何在SpringBoot中实现文件上传并将文件保存到static目录下?参考之前的引用和讨论,我们知道:1.SpringBoot可以通过MultipartFile接收上传的文件。2.需要配置文件上传的相关参数(如大小限制)[^1][^2]。3.保存文件到指定目录,并且可能需要配置资源映射。但是,用户特别要求保存到static目录下。注意:在SpringBoot中,static目录通常用于存放静态资源(如CSS,JS,图片等),这些资源可以通过HTTP直接访问。然而,直接保存文件static目录下的注意事项:1.在开发环境中,static目录是位于resources下的,打包后位于classpath中,因此是只读的。所以,我们通常不会在运行时向其中写入文件。2.在生产环境中,一般会将上传的文件保存到外部目录(如系统临时目录、专门的文件存储目录),然后通过资源映射来访问。但是,如果用户确实希望保存到static目录(比如开发环境测试),我们可以这样处理:方案一:保存到项目运行目录下的static子目录(例如:项目根目录/target/classes/static/upload/),但这只在开发时有效,且打包后jar内的static是只读的。方案二(推荐):实际上,我们通常不会写入到classpath下的static目录,而是写入一个外部目录,然后通过一个资源处理器将其映射为静态资源。因此,我们将采取以下步骤:1.在application.properties中配置一个上传路径,或者使用默认的static目录(但注意运行时写入classpath的static目录可能不可行,尤其是打包为jar后)。2.建议:在项目所在目录(或者用户目录)下创建一个与classpath无关的目录,例如项目根目录下的static_files(这样我们可以将其视为外部静态资源目录)。3.通过资源映射,将该目录映射为静态资源路径。步骤:(1)创建保存目录,例如:在项目根目录下创建upload-static目录(与src目录同级),然后在其中再建一个avatar目录用于保存头像。(2)在SpringBoot中配置静态资源映射,将物理路径映射为URL路径。考虑到这些,我们提供以下实现:第一步:配置上传目录和资源映射在application.properties中设置上传目录(这里使用相对路径,或者绝对路径):例如:upload.static-location=./upload-static第二步:编写控制器接收文件,并保存到指定目录第三步:配置静态资源映射,使得上传的文件可以通过URL访问具体代码:1.在application.properties中添加:#文件上传大小限制(参考引用[1])spring.servlet.multipart.max-file-size=2MBspring.servlet.multipart.max-request-size=2MB#自定义上传目录,相对于当前工作目录(即项目根目录)#注意:使用绝对路径也可以,例如:D:/upload-staticupload.static-location=./upload-static2.创建Controller类:```javaimportorg.springframework.beans.factory.annotation.Value;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;importjava.io.IOException;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importjava.util.UUID;@RestControllerpublicclassAvatarUploadController{//从配置文件中读取上传目录@Value("${upload.static-location}")privateStringstaticLocation;@PostMapping("/api/static/upload")publicResponseEntity<?>uploadToStatic(@RequestParam("img")MultipartFilefile)throwsIOException{if(file.isEmpty()){returnResponseEntity.badRequest().body("请选择文件");}//检查文件类型StringcontentType=file.getContentType();if(contentType==null||!contentType.startsWith("image/")){returnResponseEntity.badRequest().body("只支持图片类型");}//创建上传目录(如果不存在)FileuploadDir=newFile(staticLocation);if(!uploadDir.exists()){uploadDir.mkdirs();}//生成唯一文件名StringoriginalFilename=file.getOriginalFilename();Stringextension=originalFilename.substring(originalFilename.lastIndexOf("."));StringnewFilename=UUID.randomUUID().toString()+extension;//保存文件到目标位置PathfilePath=Paths.get(staticLocation,newFilename);Files.copy(file.getInputStream(),filePath);//构建访问URL:由于我们后面会配置静态资源映射,所以这个文件可以通过/static-files/文件访问Stringurl="/static-files/"+newFilename;returnResponseEntity.ok().body(Map.of("code",200,"url",url));}}```3.配置静态资源映射(实现关键一步):创建一个配置类,将我们定义的上传目录映射为一个URL路径(比如/static-files/**),这样上传的文件就可以通过HTTP访问了。```javaimportorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@Value("${upload.static-location}")privateStringstaticLocation;@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){//将物理路径staticLocation映射为/static-files/registry.addResourceHandler("/static-files/**").addResourceLocations("file:"+staticLocation+File.separator);}}```这样,当我们上传文件后,保存到项目根目录的upload-static目录(与src目录同级),然后可以通过URL:http://localhost:8080/static-files/uuid.jpg来访问。注意:这里使用的路径是相对于当前工作目录的,在IDEA中运行,当前工作目录通常是项目根目录。但是,请记住:在生产环境中,更推荐使用绝对路径,并且确保该目录有写入权限。此外,也可以使用云存储来避免本地存储的问题。以上方案实现了将文件保存到项目目录下的一个指定目录(非classpath:static),并且通过资源映射提供访问。如果用户坚持要保存到classpath:static目录(例如src/main/resources/static),请注意:-在开发时,我们保存文件到src/main/resources/static目录下,但是这样在运行中修改,重新编译或打包会导致文件丢失。-而且,当项目打包成jar后,这个目录是只读的,无法写入。因此,我们强烈建议使用外部目录,而不是classpath下的static目录。相关问题:1.如何修改SpringBoot上传文件的大小限制?[^1]2.如何实现多文件上传?[^3]3.上传文件后,如何将文件信息保存到数据库?4.如何防止上传的文件名冲突?如果用户的问题是关于如何保存到src/main/resources/static目录的(尽管不推荐),可以这样尝试(仅适用于开发环境):将配置的上传目录设置为:src/main/resources/static/upload/,但是需要注意:-在IDEA中运行,工作目录通常是项目根目录,因此可以这样写:upload.static-location=./src/main/resources/static/upload/-但是,当程序以jar方式运行时,这个路径在jar内,是只读的,所以会写入失败。所以,我们强调:不要写入到src/main/resources/static/目录。最后,我们提供的是写入外部目录并通过资源映射访问的方案,这是生产环境友好的方式。注意:上述代码中,我们使用了@Value注入配置文件中的路径。另外,在保存文件时,我们使用了Files.copy,也可以使用file.transferTo(newFile(...))。另外,记得处理文件保存时可能出现的异常(如IO异常),上述代码为了简洁,在方法签名上抛出了IOException,实际可以更细致的异常处理。根据引用[1]和[2],我们设置了文件大小限制,并通过引用[3]的多文件上传示例,我们可以扩展多文件上传。因此,我们提供的方案是可靠且实用的。</think> ### Spring Boot 文件上传至 static 目录的实现方法 在 Spring Boot 中将上传的文件保存到 `static` 目录需要特别注意静态资源的处理和访问路径配置。以下是完整实现步骤: #### 1. 创建文件上传控制器 ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.UUID; @RestController public class StaticFileUploadController { // 从配置文件中获取静态资源目录路径 @Value("${spring.web.resources.static-locations}") private String staticLocations; @PostMapping("/api/static-upload") public ResponseEntity<?> uploadToStatic( @RequestParam("img") MultipartFile file) throws IOException { if (file.isEmpty()) { return ResponseEntity.badRequest().body("请选择文件"); } // 文件类型校验 String contentType = file.getContentType(); if (!contentType.startsWith("image/")) { return ResponseEntity.badRequest().body("仅支持图片格式"); } // 处理静态目录路径 String[] locations = staticLocations.split(","); String targetDir = locations[0].replace("file:", "") + "/upload/"; // 创建目录(如果不存在) Path uploadPath = Paths.get(targetDir); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } // 生成唯一文件名 String originalFilename = file.getOriginalFilename(); String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); String newFilename = UUID.randomUUID().toString() + extension; // 保存文件static/upload目录 Path targetPath = uploadPath.resolve(newFilename); Files.copy(file.getInputStream(), targetPath); // 返回访问URL(无需添加upload目录) String accessUrl = "/upload/" + newFilename; return ResponseEntity.ok(Map.of( "code", 200, "message", "文件已保存至静态目录", "url", accessUrl )); } } ``` #### 2. 配置文件上传参数 (application.properties) ```properties # 文件上传大小限制[^1] spring.servlet.multipart.max-file-size=5MB spring.servlet.multipart.max-request-size=5MB # 静态资源路径配置(包含static目录) spring.web.resources.static-locations=classpath:/static/,file:./uploads/ # 启用静态资源处理 spring.mvc.static-path-pattern=/** ``` #### 3. 关键说明 1. **静态资源路径处理**: - `static-locations` 配置支持多个位置,默认包含 `classpath:/static/` - 我们添加文件系统的自定义上传目录 `file:./uploads/` - 上传时自动创建 `uploads/upload` 的子目录 2. **文件保存位置**: ``` project-root/ ├── src/main/resources/static/ # 默认静态资源目录 ├── uploads/ # 自定义上传目录(与src同级) │ └── upload/ # 实际保存位置 ``` 3. **访问路径**: - 上传文件路径:`uploads/upload/filename.jpg` - 访问URL:`/upload/filename.jpg` 4. **资源映射原理**: - Spring Boot 会自动映射 `static-locations` 配置的所有路径 - `/upload/**` 会同时映射到: - `classpath:/static/upload/` (优先) - `file:./uploads/upload/` (如果前一个不存在) #### 4. 可选增强配置 ```java // 在配置类中添加自定义资源处理器 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/upload/**") .addResourceLocations("classpath:/static/upload/", "file:./uploads/upload/"); } } ``` #### 常见问题解决方案 1. **文件无法访问**: - 检查目录权限 `chmod -R 755 uploads/` - 确保资源路径配置正确 2. **部署环境差异**: ```properties # 生产环境使用绝对路径更可靠 spring.web.resources.static-locations=file:/opt/static/,${user.home}/app-uploads/ ``` 3. **资源冲突处理**: - 当 `classpath:/static/upload/` 和 `file:./uploads/upload/` 存在同名文件- Spring Boot 优先使用 classpath 中的资源
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Bug

谢谢老板,老板大气,老板硬邦邦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值