2017-06-28 7 views
0

Ich verwende Spring boot v1.5.3.RELEASE und jetzt kann ich Dateien normalerweise herunterladen, wenn ich die Erweiterungsdatei nicht enthalten. Wenn ich versuche, Dateien mit den typischen Dateierweiterungen (jpg, jpeg, mp3, mp4 usw.) herunterzuladen, lässt Spring die Anfrage fallen. Ein Beispiel Anfrage könnte sein: localhost:8888/public/file/4.jpgSpring Boot nicht akzeptiert Dateierweiterungen

Mein Application.java ist:

public class Application extends RepositoryRestMvcConfiguration { 

    public static void main(String[] args) { 
    // System.getProperties().put("server.port", 8888); 
    // System.getProperties().put("spring.thymeleaf.mode", "LEGACYHTML5"); 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public RepositoryRestConfigurer repositoryRestConfigurer() { 

     return new RepositoryRestConfigurerAdapter() { 
      @Override 
      public void configureRepositoryRestConfiguration(
           RepositoryRestConfiguration config) { 
       config.exposeIdsFor(Noticia.class, file.class, Label.class, Reaction.class); 
      } 
     }; 

    } 



} 

Mein Controller.java Stück Code ist:

@RequestMapping(value = "public/file/{filename}", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) 
@ResponseBody 
public FileSystemResource getPublicFileWithSuffix(@PathVariable("filename") String filename) { 


     System.out.println("filename with suffix sepparated! " + filename); 
     String id = filename.split(Pattern.quote("."))[0]; 

     file file = fileRepository.findById(Long.parseLong(id)); 
     File f = new File("/srv/Ressaca/locals/" + file.getId() + file.getExtension()); 
    return new FileSystemResource(f); 
} 

Nach googeln ich gefunden habe, ein Teillösung. Mit dieser Lösung, wenn ich etwas wie localhost:8888/public/file/4.hello oder localhost:8888/public/file/4.jpj es funktioniert, aber wenn die Erweiterung ist einige echte Erweiterung wie (jpg, jpeg, mp3, mp4 usw.) der Spring-Boot weiterhin die Anfrage fallen.

-Controller nach googeln:

@RequestMapping(value = "public/file/{filename:.+}", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) 
@ResponseBody 
public FileSystemResource getPublicFile(@PathVariable("filename") String filename) { 


     System.out.println("filename " + filename); 
     String id = filename.split(Pattern.quote("."))[0]; 

     file file = fileRepository.findById(Long.parseLong(id)); 
     File f = new File("/srv/Ressaca/locals/" + file.getId() + file.getExtension()); 
    return new FileSystemResource(f); 

} 

Wie kann ich die "echte Dateien Endung" aktivieren?

+2

Diese helfen könnten: https://stackoverflow.com/questions/40557637/how-to-return-an-image-in-spring-boot-controller-and-serve-like-a-file- System –

+1

Vielen Dank. Ich musste hinzufügen "verbraucht = MediaType.ALL_VALUE" –

+0

Aus irgendeinem Grund berücksichtigt Spring die URL-Dateierweiterung und überschreibt den Wert aus dem Accept-Header mit dem impliziten Medientyp, der von der Erweiterung kommt. (Zumindest habe ich das Debuggen dieses Problems gesehen Frühling 4.3.10.RELEASE.) Zum Beispiel haben Sie '.../file.txt' dann wird es versuchen,' text/plain' zu entsprechen, auch wenn der Kopf akzeptieren ist 'application/json'. Lösung ist, die URL im Browser mit einem trainling '/' zu beenden, wie '.../file.txt /' –

Antwort

1

Verwenden Sie * anstelle von +, aber alles sollte funktionieren. Ich finde keine Beschränkung, die Erweiterung von Abfrageparameter in irgendeiner Version von Spring Boot sendet.

@RequestMapping("/public/file/{fileName:.*}")