2016-04-21 15 views
0

Ich entwickle eine Rest API mit Spring Boot und AngularJS auf der Client-Seite, ich lade Dateien in/resources/static/upload mit Spring mit dem RestController unten und mit ihnen in den ClientSpring: Verweis auf die Ressourcen/statische Ordner

Seite
@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(); 
    } 

} 

Hier ist, wie ich das hochgeladene Bild „image.jpg“

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

Aber zugegriffen wird, wenn ich mvn Paket lief und ich meine Anwendung jar-Datei starten, kann ich nicht die hochgeladen zugreifen Bild auf der Client-Seite, ich bekomme 404 nicht gefunden.

Kann jemand erklären, wie Spring speichern und auf statische Ressourcen verweisen und wie kann ich dieses Problem lösen.

+2

Sie können nicht ... Sie können nicht auf einen Pfad im Classpath hochladen, der sich effektiv im Jar befindet. –

+0

Wo kann ich meine Dateien hochladen und auf die Clientseite zugreifen? – jemlifathi

+1

Verwenden Sie einen Pfad im Dateisystem oder einen geeigneten Datenspeicher. –

Antwort

2

Ich verwende absoluten Pfad zum Verzeichnis und das funktioniert in beiden Fällen: wenn es mit mvn spring-boot:run läuft und wenn es als java -jar app.jar ausgeführt wird.

Zum Beispiel könnten Sie versuchen, Uploads zu /opt/upload (stellen Sie sicher, dass es existiert und Benutzer-Berechtigungen in sie schreiben) zu speichern:

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

Auch sollten Sie Frühling konfigurieren Uploads aus diesem Verzeichnis dienen:

@Configuration 
@EnableWebMvc 
public class MvcConfig extends WebMvcConfigurerAdapter { 

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

} 

Weitere Informationen über die Konfiguration von Ressourcenhandler: http://www.baeldung.com/spring-mvc-static-resources

+0

Wie kann auf Dateien in/opt/upload von der Clientseite (angularjs) zugegriffen werden? – jemlifathi

+0

Was meinst du mit "Zugriff"? Bilder werden wie vorher verfügbar sein, per URL wie "http: // localhost: 8080/upload/image.jpg" –

+0

Es funktioniert! Vielen Dank – jemlifathi

0

allererst Sie nicht in die gespeichert werden können Ordnerstruktur in Ihrem IDE sehen, die nicht ist, wie Sie Ihren Code in einem bereitgestellte Paket sein wird

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

Speicher mit relativen Pfad

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

und auch die Ressourcenstellenzuordnung im Frühjahr Config für Ihr Bild hinzufügen Ordner hochladen

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