2015-06-08 18 views
5

Sto tentando di restituire un'immagine su spring-boot (1.2.2)
Come dovrei impostare il tipo di contenuto? non delle seguenti stanno lavorando per me (il che significa che le intestazioni di risposta non sono contenenti 'Content-Type' intestazione a tutti):spring boot setContentType non funziona

@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

Motivi definiscono "non funziona" . –

+0

@ci_ Voglio dire che le intestazioni di risposta non contengono affatto intestazione 'content-type' – Shoham

risposta

1

Capito ... dovuto aggiungere ByteArrayHttpMessageConverter-WebConfiguration classe:

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

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

E allora il mio secondo tentativo (getFile3()) funzionava correttamente

+1

Ottimo .. forse è dovuto a diverse versioni di SpringBoot (stiamo usando la 1.2.3), ma l'uso di 'produce' non ha richiesto la registrazione del convertitore di array di byte aggiuntivo .. funziona. –

+0

@ tombola82 Penso che sia dovuto all'annotazione '@ Configuration' che sovrascrive molte impostazioni predefinite per la primavera. Prima ho aggiunto 'ByteArrayHttpMessageConverter' Potrei anche farlo funzionare rimuovendo l'annotazione' @ Configuration' ... – Shoham

+0

hmm .. Non ne sono totalmente convinto ;-) usiamo anche '@ Configuration' nelle classi di configurazione (in congiuntamente a '@ SpringBootApplication' che a sua volta abilita auto config e _that_ fornisce un sacco di configurazione di default) - ancora nessun convertitore di messaggi di array di byte presente .. e 'funziona'. '@ Configuration' non è un'annotazione spring-boot, solo un framework spring per java config. Ma tu hai una soluzione, questa è la cosa più importante! –

6

In primo luogo, è necessario applicare la @ResponseBody annotazioni, oltre a @RequestMapping, a meno che non si utilizzi @RestController a livello di classe anziché solo @Controller. Inoltre, prova l'elemento produces di @RequestMapping ad es.

@RequestMapping(value = "/files2/{file_name:.+}", method = RequestMethod.GET, produces = {MediaType.IMAGE_JPEG_VALUE}) 

Questo dovrebbe "restringere la mappatura primaria" e garantire che il tipo di contenuto corretto sia impostato. Vedere la documentazione: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-ann-requestmapping-produces

+0

Posso fare solo questo 'produce =" image/jpeg "' ma i risultati sono gli stessi (le intestazioni di risposta non contengono 'content-type' intestazione a tutti), inoltre penso che questo sia solo per 'restringere la mappatura primaria' e * NON per *' assicurarsi che sia impostato il tipo di contenuto corretto' – Shoham

+0

Corretto il valore MediaType in produce - avrebbe dovuto essere la versione stringa come punto su. Per quanto posso dire e provarlo da solo, dovrebbe funzionare - anche senza '@ ResponseBody' mentre stai restituendo un'entità .. hai estratto il codice per impostare manualmente l'intestazione del tipo di contenuto? Per inciso ho usato il tuo secondo tentativo di soluzione (con 'HttpEntity ' per testarlo) –

+1

sul tuo secondo punto - afferma il documento: _ "Inoltre, l'uso della condizione di produzione garantisce che il tipo di contenuto effettivo utilizzato per generare la risposta rispetti i tipi di media specificato nella condizione di produzione "_. È così che funziona comunque per me - se tolgo l'elemento 'produce' ho solo il tipo di contenuto predefinito' text/html'. –