2016-04-21 6 views
0

Я разрабатываю Rest API с использованием Spring Boot и AngularJS на стороне клиента, я загружаю файлы в/resources/static/upload с помощью Spring с помощью RestController ниже и используя их в клиенте сторона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" /> 

Но, когда я побежал МВН пакет и я запустить мой опарник приложения, я не могу получить доступ к закачанному образ на стороне клиента, я не получаю 404.

Может кто-нибудь объяснить, как Spring хранит и ссылается на статические ресурсы и как я могу решить эту проблему.

+2

Вы не можете ... Вы не можете загрузить путь в пути к классам, который будет эффективно находиться внутри банки. –

+0

Итак, где я могу загружать свои файлы и до сих пор могу получить к ним доступ на стороне клиента? – jemlifathi

+1

Используйте путь в файловой системе или подходящее хранилище данных. –

ответ

2

Я использую абсолютный путь к каталогу, и это работает в обоих случаях: когда он запускается с 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

+0

Как получить доступ к файлам в/opt/upload со стороны клиента (angularjs)? – jemlifathi

+0

Что вы подразумеваете под «доступом»? Изображения будут доступны по-прежнему, по URL-адресу, например 'http: // localhost: 8080/upload/image.jpg' –

+0

Он работает! большое спасибо – jemlifathi

0

Прежде всего вы не можете хранить в Структура папок вы видите в вашой 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/" /> 
Смежные вопросы