【问题标题】:Spring: refering the resources/static folderSpring:引用资源/静态文件夹
【发布时间】:2016-08-14 14:22:33
【问题描述】:

我正在客户端使用 Spring Boot 和 AngularJS 开发一个 Rest API,我正在使用 Spring 使用下面的 RestController 将文件上传到 /resources/static/upload 并在客户端使用它们

@RestController
@CrossOrigin("*")
public class FilmController {
    @Autowired
    private FilmRepository filmRepository;

    @RequestMapping(value = "/films", method = RequestMethod.POST)
    public void saveFilm(@RequestParam("file") MultipartFile file) throws Exception {

        File convFile = new File("src/main/resources/static/upload/"+file.getOriginalFilename());

        convFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(convFile);
        Blob blob = new SerialBlob(file.getBytes());

        fos.write(file.getBytes());
        fos.close();
        System.out.println(convFile.getName());


        filmRepository.save(new Film(convFile.getName(), blob));
    }

    @RequestMapping(value = "/films", method = RequestMethod.GET)
    public List<Film> getAllFilms() {
        return filmRepository.findAll();
    }

}

这是我如何访问上传的图片“image.jpg”

<img src="http://localhost:8080/upload/image.jpg" />

但是,当我运行 mvn package 并启动我的应用程序 jar 文件时,我无法在客户端访问上传的图像,我得到 404 not found。

有人可以解释一下 Spring 如何存储和引用静态资源以及如何解决这个问题。

【问题讨论】:

  • 你不能......你不能上传到类路径中的路径,该路径实际上将在 jar 内。
  • 那么我在哪里可以上传我的文件并且仍然可以在客户端访问它们?
  • 使用文件系统上的路径或合适的数据存储。

标签: java angularjs spring spring-mvc spring-boot


【解决方案1】:

我正在使用目录的绝对路径,这在两种情况下都有效:当它以 mvn spring-boot:run 运行时,以及当它以 java -jar app.jar 运行时。

例如,您可以尝试将上传的内容保存到/opt/upload(确保它存在并且用户有权写入):

File convFile = new File("/opt/upload/"+file.getOriginalFilename());

您还应该将 Spring 配置为从该目录提供上传服务:

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
          .addResourceHandler("/upload/**")
          .addResourceLocations("file:/opt/upload/");
    }

}

有关配置资源处理程序的更多信息:http://www.baeldung.com/spring-mvc-static-resources

【讨论】:

  • 如何从客户端(angularjs)访问/opt/upload中的文件?
  • “访问”是什么意思?图片将像以前一样通过 URL 提供,例如 http://localhost:8080/upload/image.jpg
【解决方案2】:

首先,您不能存储在 IDE 中看到的文件夹结构中,这不是您的代码在部署包中的样子

File convFile = new File("src/main/resources/static/upload/"+file.getOriginalFilename());

使用相对路径存储

File convFile = new File("/static/upload/"+file.getOriginalFilename());

并在 spring config 中为您的图像上传文件夹添加资源位置映射。

<mvc:resources mapping="/upload/**" location="/static/upload/" />

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 2017-06-01
    • 1970-01-01
    • 2016-10-01
    • 2019-09-16
    • 2015-08-21
    • 2014-04-13
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多