2016-09-29 4 views
0
  1. Я пытаюсь загрузить zip-файл с фиксированного местоположения, присутствующего на сервере.
  2. В моем методе «Отдых» я просто передаю имя файла из клиента (браузера). (см. Ниже код).
  3. В моем методе «Отдых» я отправляю почтовый файл клиенту.Zip-файл, загружаемый без расширения .zip в Chrome через Java

  4. Файл загружается в браузере без каких-либо проблем.

Моя проблема в том, что zip-файл загружается в браузер без расширения .zip.

@RequestMapping(value = "/zip/{filePath}", method = RequestMethod.GET) 
public @ResponseBody void downloadZip(@PathVariable("filePath") String filePath, HttpServletRequest request, HttpServletResponse response) throws IOException { 

    ServletContext context = request.getServletContext(); 
    File downloadFile = new File(filePath); 
    FileInputStream inputStream = new FileInputStream(downloadFile); 
    // get output stream of the response 
    OutputStream outStream = response.getOutputStream(); 

    byte[] buffer = new byte[(int) downloadFile.length()]; 
    int bytesRead = -1; 

    // write bytes read from the input stream into the output stream 
    while ((bytesRead = inputStream.read(buffer)) != -1) { 
    outStream.write(buffer, 0, bytesRead); 
    } 
    // get MIME type of the file 
    String mimeType = context.getMimeType(fullPath); 
    if (mimeType == null) { 
    // set to binary type if MIME mapping not found 
    mimeType = "application/octet-stream"; 
    } 
    System.out.println("MIME type: " + mimeType); 

    // set content attributes for the response 
    response.setContentType(mimeType); 
    response.setContentLength((int) downloadFile.length()); 

    response.setHeader("Content-Disposition", 
     String.format("attachment; filename=\"%s\"", downloadFile.getName())); 
    logger.error("Filename = " + downloadFile.getName()); 
    inputStream.close(); 
    outStream.close(); 
} 

PS: Файл загружается на какую-либо машину с ZIP и на какой-либо машине без ZIP. Я тестировал только на хром (по требованию клиента). Я думаю, что есть проблема с настройками Chrome, которые мне нужно посмотреть (просто догадка).

Может кто-нибудь помочь в этом?

Заранее спасибо ....

+2

Измените порядок между настройкой заголовков откликов и выталкиванием файла вниз по выходному потоку - в конце концов, заголовки должны уйти первыми. –

+0

Пробовал, но он не работает. В любом случае спасибо. – krohit

+0

Попробуйте mime-type для «application/zip, application/octet-stream» –

ответ

1

Изменить порядок между настройкой заголовков ответа и толкая файл вниз выходной поток - в конце концов, заголовки должны оставить первый.

[Изменено]

  1. "Почему установка HttpServletResponse в запуске эффекты код."
    Ну, просто: клиент должен получать инструкции о том, что делать с полезной нагрузкой, интерпретируя заголовки ответов HTTP. Если они не установлены в начале, отправка этих заголовков в конце передачи происходит слишком поздно. И это предполагает, что HttpServletResponse фактически отправит эти заголовки при вызове с setHeader, что является большим предположением - я подозреваю, что эти заголовки на самом деле не будут отправлены после, вызывающего response.getOutputStream - маловероятно, что ответ будет буферизовать всю полезную нагрузку, чтобы ждать вызывающий, чтобы указать эти заголовки.
+0

Это отлично работает! Теперь у меня есть вопрос относительно этого поведения. 1) Почему настройка HttpServletResponse при запуске запускает код. 2) Почему это работает на какой-то машине и не работает на какой-либо машине (старый код). – krohit

+0

2. «Почему это работает на какой-то машине и не работает на какой-либо машине (старый код)». Я не уверен, что я понимаю вопрос: на какой машине вы работаете: разные серверные машины или обработка различных клиентских машин запрос на загрузку? –

+0

Спасибо за ваш ответ, Адриан. По машине я имел в виду, что клиент обрабатывал загрузку. (sry, я должен был указать это). Следовательно, я пришел к выводу о проблеме с хромом (возможно, некоторые изменения настроек ...) – krohit

Смежные вопросы