2015-12-15 4 views
0

У меня проблема с диапазоном. Я пытаюсь иметь контроллер Spring, который позволяет использовать ZIP-файл. Вот фрагмент кода, который работает, когда пользователь делает запрос GET в URL браузера запустите файл скачатьSpring MVC file загрузить IOUtils.copy работает, но не FileCopyUtils

@RequestMapping(value = "mypath/",method = RequestMethod.GET) 
    public void downloadFiles(@PathVariable("id") String id) { 

    InputStream a = new ByteArrayInputStream(fileService.get(id)); 
    StringBuilder sb = new StringBuilder("attachment; filename=).append(id).append(".zip"); 
    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, sb.toString()); 
    org.apache.commons.io.IOUtils.copy(a, response.getOutputStream()); 
    response.setContentType("application/x-download"); 
    response.flushBuffer(); 
    } 

Но ... если я заменю IOUtils.copy на FileCopyUtils.copy, когда я попал в URL браузер просто отображать содержимое файла вместо его загрузки

Может ли кто-нибудь объяснить мне, что происходит?

ответ

1

старый вопрос, но может быть полезен для будущих или текущих поисковиков.

В настоящее время я работаю над этим, и я использовал как для загрузки файла с Spring MVC4, так и с MongoDB, и они оба работают хорошо.

response.setContentType("application/force-download"); 
response.setHeader("Content-Disposition", "attachment; filename=\""+ mDBGridFSFile.getFilename() +"\""); 

здесь mDBGridFSFile является MongoDB GridFS Файл, содержащий содержимое файла.

Это contentType, который я использую для принудительного его загрузки вместо сброса буфера в браузере и принудительного его записи на диск.

//FileCopyUtils.copy(mDBGridFSFile.getInputStream(), response.getOutputStream()); 

IOUtils.copyLarge(mDBGridFSFile.getInputStream(), response.getOutputStream()); 

Я тестировал оба в моем проекте, это работает, может быть проблема с вашим заголовком.