2015-12-02 4 views
0

Я пытаюсь создать службу REST Java, которая будет загружать слово doc. Файл загружается, но содержимое представляет собой просто мусорный гекс, а не фактическое содержимое документа Word. Мой пример кода ниже. Что мне не хватает? До & после того, как файлы имеют одинаковое количество байтов.Служба отправки REST поврежденного файла

@SuppressWarnings("resource") 
@RequestMapping(value = "get/testdoc", method=RequestMethod.GET, produces="application/octet-stream) 
public @ResponseBody ResponseEntity<byte[]> getTestDoc() throws Throwable{ 

    File doc = new File("C:\\temp\\file.doc"); 

    InputStream is = new FileInputStream(doc); 
    byte[] bytes = IOUtils.toByteArray(is); 

    HttpHeaders responseHeaders = new HttpHeaders(); 
    responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
    responseHeaders.set("Content-Disposition" , "Attachment; filename=file.doc"); 
    responseHeaders.setContentLength(ProposalDoc.length()); 



    return new ResponseEntity<byte[]>(bytes, responseHeaders, HttpStatus.OK); 
} 
+2

Как вы определили, что загруженный файл является «мусор шестигранной»? Вы пытались открыть его с помощью Word? Кроме того, было бы полезно указать, какую версию Spring вы используете. – Pyranja

+0

Что делать, если вы не укажете поток октетов и длину содержимого? –

+0

Я открыл файл словом. Использование Spring 3.1.1. это необходимо для кодирования Base64 перед загрузкой? –

ответ

0

Спасибо за помощь. Я закончил в обход Spring &, прикрепляя файл к ответу, как указано в приведенном ниже коде. Я подозреваю, что спринт превращал байты как-то за кулисами. Я просмотрел конфигурацию ByteArrayHttpMessageConverter, но это, похоже, не помогло. На данный момент это достаточно хорошо.

@SuppressWarnings("resource") 
@RequestMapping(value = "get/doc", method=RequestMethod.GET, produces="application/octet-stream") 
    public HttpEntity getProposalDocs(HttpServletResponse response) throws Throwable{ 
     File doc = new File("C:\\temp\\file.doc"); 

     InputStream is = new FileInputStream(doc); 

     response.setHeader("Content-Disposition", "attachment;filename=\"test.doc\""); 
     response.setHeader("Content-Type", "application/octet-stream;"); 
     StreamUtils.copy(is ,response.getOutputStream()); 

     return new ResponseEntity(HttpStatus.OK); 
    } 
1

Я думаю, что есть две проблемы:

1. Длина заголовка:

я мое мнение есть хотя бы одна очень странная линия:

responseHeaders.setContentLength(ProposalDoc.length()); 

I думаю, это должно быть:

responseHeaders.setContentLength(bytes.length); 

2. @ResponseBody Аннотация

Если вы используете тип возвращаемого ResponseEntity<byte[]>, то вы НЕ должны добавить @ResponseBody.

@RequestMapping(value = "get/testdoc", method=RequestMethod.GET) 
public ResponseEntity<byte[]> getTestDoc() throws Throwable{ 
    ... 
} 
+0

Я обновил эту строку. Тот же результат. –

+0

@Mr Smith: взгляните на вторую проблему – Ralph

+0

Спасибо. Я удалил аннотацию @ResponseBody, но у меня такая же проблема. –

0

попытка заменить производит = "приложения/октет-поток") с производит = "приложение/vnd.ms-слово")

+0

no help ........ –

+0

и файл открывается нормально перед загрузкой? файлы, находящиеся в папке: C: \\ temp \\ file.doc? –

+0

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

0

Проверьте этот код, он отлично работает со мной.

@RequestMapping(value = "/get/doc" , method = RequestMethod.GET , 
    produces = "application/msword") 
    public ResponseEntity<InputStreamResource> getProposalDocs() throws IOException{ 
    ClassPathResource docfile = new ClassPathResource("file.doc"); 
    HttpHeaders headers 

= new HttpHeaders(); 
    headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); 
      headers.add("Pragma", "no-cache"); 
      headers.add("Expires", "0"); 
     return ResponseEntity.ok() 
       .headers(headers) 
       .contentLength(docfile.contentLength()) 
       .contentType(MediaType.parseMediaType("application/msword")) 
       .body(new InputStreamResource(docfile.getInputStream())); 
    } 

Редакция: идея, которая работала со мной, чтобы вернуться InputStreamResource вместо байт []. Также укажите тип контента, который создает = "application/octet-stream".

Это прекрасно работает со мной, не нужно обводной ответ сервлета ..

+0

добавьте текст, чтобы объяснить, как ваш ответ разрешает текущую проблему с OP и помогает другим, у которых есть такая же проблема. –