2016-04-21 163 views
0

我在客户端使用Spring Boot和AngularJS开发Rest API,我使用下面的RestController将文件上传到/ resources/static/upload,并在客户端使用它们侧Spring:引用资源/静态文件夹

@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包,启动我的应用程序JAR文件,我无法访问上传图片在客户端,我没有找到404。

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

+2

你不能......你不能上传到类路径中的路径,它将有效地在jar中。 –

+0

那么我可以在哪里上传我的文件,并仍然可以在客户端访问它们? – jemlifathi

+1

在文件系统或合适的数据存储上使用路径。 –

回答

2

我正在使用目录的绝对路径,并且在两种情况下都能正常工作:它与mvn spring-boot:run一起运行时以及它运行的时间为java -jar app.jar

例如,你可以尝试上传保存到/opt/upload(确保它的存在和用户有权写进去):

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

你也应该配置Spring从该目录服务上传: http://www.baeldung.com/spring-mvc-static-resources

+0

如何从客户端访问/ opt /上传文件(angularjs)? – jemlifathi

+0

“访问”是什么意思?图像将像以前一样可用,通过像“http:// localhost:8080/upload/image.jpg”这样的URL登录。 –

+0

它工作正常!非常感谢你 – jemlifathi

0

首先,你不能在存储:有关配置资源处理

@Configuration 
@EnableWebMvc 
public class MvcConfig extends WebMvcConfigurerAdapter { 

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

} 

更多信息文件夹结构,你在你的IDE看到,是不是你的代码怎么会在部署的数据包

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

店使用相对路径

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

,并添加资源位置映射在春天的配置为你的形象上传文件夹。

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