2016-12-23 14 views
0

У меня есть файлы .xlsx, .docx и .pdf, сохраненные на моем сервере. Контроллер загрузки выглядит следующим образом:Файлы, загруженные через контроллер пружины, повреждены

@RestController 
public class FileDownload { 

@RequestMapping(value = "/files/{file_name}/", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) 
public void getFile(
     @PathVariable("file_name") String file, 
     HttpServletResponse response) throws Exception { 

     String fileType=file.split("\\.")[1]; 

     switch(fileType){ 
      case "xlsx": response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
       break; 
      case "docx": response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
       break; 
      case "pdf": response.setContentType("application/pdf"); 
       break; 
      default: response.setContentType("application/octet-stream"); 
       break; 
     } 

     response.setHeader("Content-Disposition", "attachment; filename=" + file); 
     response.setHeader("Content-Length", String.valueOf(file.length())); 

     InputStream is = FileDownload.class.getResourceAsStream("/files/" + file); 

     copy(is, response.getOutputStream()); 
     response.flushBuffer(); 
} 
} 

При попытке открыть файл, первенствует говорит мне, что поврежден и нуждается в ремонте. Процесс ремонта также не работает.

Что может быть причиной этой ошибки?

Есть много подобных вопросов, но ни одно из предлагаемых решений не работает.

Единственное «исправление», которое работает, добавляет атрибут «загрузить» к ссылке в интерфейсе, который загружает файл. Но, к сожалению, это не работает для IE.

ответ

0

У меня была такая же проблема при загрузке zip-файла. Мое решение было в конечном итоге вместо этого вернуть массив байтов из моего контроллера (см. https://stackoverflow.com/a/33302570/4921953), а затем обработать это на моем интерфейсе JavaScript по-разному для Chrome/Firefox (я использовал атрибут загрузки, который вы использовали) и Internet Explorer (см. https://stackoverflow.com/a/24354303/4921953). Убедитесь, что у вас есть responseType, установленный в «arraybuffer», когда вы делаете HTTP-запрос с передней стороны на свой сервер.