2015-06-08 23 views
5

Ich versuche, ein Bild auf Spring-Boot (1.2.2)
Wie soll ich den Inhaltstyp festlegen? Nicht der folgenden sind für mich arbeiten (was bedeutet, dass Response-Header enthalten, sind ‚content-type‘ Header überhaupt nicht):Spring Boot setContentType funktioniert nicht

@RequestMapping(value = "/files2/{file_name:.+}", method = RequestMethod.GET) 
public ResponseEntity<InputStreamResource> getFile2(final HttpServletResponse response) throws IOException { 
    InputStream is = //someInputStream... 
    org.apache.commons.io.IOUtils.copy(is, response.getOutputStream()); 
    response.setContentType("image/jpeg"); 
    InputStreamResource inputStreamR = new InputStreamResource(is); 
    return new ResponseEntity<>(inputStreamR, HttpStatus.OK); 
} 

@RequestMapping(value = "/files3/{file_name:.+}", method = RequestMethod.GET) 
public HttpEntity<byte[]> getFile3() throws IOException { 
    InputStream is = //someInputStream... 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.IMAGE_JPEG); 
    return new HttpEntity<>(IOUtils.toByteArray(is), headers); 
} 
+0

Pleas definieren „nicht funktioniert“ . –

+0

@ci_ Ich meine, dass Response-Header überhaupt keine 'content-type'-Header enthalten – Shoham

Antwort

1

Verstanden ... Hatte ByteArrayHttpMessageConverter-WebConfiguration Klasse hinzuzufügen:

@Configuration 
@EnableWebMvc 
@ComponentScan 
public class WebConfiguration extends WebMvcConfigurerAdapter { 

@Override 
public void configureMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) { 
    httpMessageConverters.add(new ByteArrayHttpMessageConverter()); 
} 
} 

Und dann mein zweiter Versuch (getFile3()) arbeitete korrekt

+1

Großartig ... vielleicht liegt es an verschiedenen SpringBoot-Versionen (wir verwenden 1.2.3), aber die Verwendung von 'products' erforderte keine Registrierung des zusätzlichen Byte-Array-Konverters. Es funktioniert einfach. –

+0

@ tombola82 Ich denke, es ist wegen der '@ Configuration' Annotation, die viele Standardeinstellungen für den Frühling überschreibt. Bevor ich 'ByteArrayHttpMessageConverter' hinzugefügt habe, konnte ich das auch durch Entfernen der' @ Configuration' Annotation machen ... – Shoham

+0

hmm .. davon bin ich nicht ganz überzeugt ;-) Wir verwenden auch '@ Configuration' auf Config-Klassen (in Verbindung mit '@ SpringBootApplication', die wiederum Auto Config aktiviert und _that_ bietet eine Menge von Standard-Config) - noch keine Byte-Array-Nachrichtenkonverter vorhanden .. und es 'einfach funktioniert'. '@ Configuration' ist keine Spring-Boot-Annotation, nur Spring-Framework für Java-Config. Aber Sie haben eine Lösung, das ist das Wichtigste! –

6

Zunächst müssen Sie die @ResponseBody Anmerkung zusätzlich zu @RequestMapping anzuwenden, es sei denn, Sie verwenden @RestController auf Klassenebene statt nur @Controller. Versuchen Sie auch das produces Element von @RequestMapping z.

Dies sollte die primäre Zuordnung einschränken und sicherstellen, dass der richtige Inhaltstyp festgelegt ist. Lesen Sie die Dokumentation: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-ann-requestmapping-produces

+0

Ich kann dies nur tun 'produziert =" image/jpeg "' aber die Ergebnisse sind die gleichen (Antwort-Header enthalten nicht' content-type ' header überhaupt), und ich denke, dies ist nur für 'schmal die primäre Zuordnung 'und * NOT zu *' stellen Sie sicher, dass der richtige Inhaltstyp eingestellt ist' – Shoham

+0

Just korrigiert den MediaType-Wert in produziert - sollte die String-Version wie Sie zeigen aus. Soweit ich das beurteilen kann und es einfach selbst ausprobieren, sollte das funktionieren - auch ohne '@ ResponseBody', da Sie eine Entity zurückgeben. Haben Sie den Code zum manuellen Setzen des Content-Type-Headers herausgenommen? Übrigens habe ich Ihre zweite versuchte Lösung (mit 'HttpEntity ', um dies zu testen) –

+1

auf Ihrem zweiten Punkt - das Dokument lautet: _ "Darüber hinaus stellt die Verwendung der produziert Bedingung den tatsächlichen Inhaltstyp zum Generieren der Antwort verwendet beachtet die Medientypen spezifiziert in der Produktionsbedingung "_. So funktioniert es jedenfalls für mich - wenn ich das 'products'-Element herausnehme, bekomme ich einfach' text/html' default content-type. –

Verwandte Themen