2016-09-29 8 views
0
  1. 서버에있는 고정 위치에서 zip 파일을 다운로드하려고합니다.
  2. 내 Rest 메서드에서 클라이언트 (브라우저)의 파일 이름을 전달 중입니다. (아래 코드 참조).
  3. 내 Rest 방법에서 zip 파일을 클라이언트로 보내고 있습니다.Java에서 Chrome에서 .zip 확장자없이 Zip 파일을 다운로드 중입니다.

  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

마임 유형을 "application/zip, application/octet-stream"으로 시도하십시오. –

답변

1

변경 응답 헤더를 설정하고 출력 스트림 아래 파일을 밀어 사이의 순서는 - 결국, 헤더 먼저 떠나해야합니다.

[편집 됨]

  1. "왜 효과에게 코드를 시작으로 HttpServletResponse를 설정."
    글쎄, 간단합니다 : 클라이언트는 HTTP 응답 헤더를 해석하여 페이로드로 수행 할 작업에 대한 지시 사항을 수신해야합니다. 그것들이 처음에 설정되어 있지 않다면, 전송이 끝날 때 그 헤더들을 보내는 것은 너무 늦게 온다. 그리고 이것은 HttpServletResponse가 실제로 큰 헤더 인 setHeader과 함께 호출 될 때 헤더를 전송한다고 가정합니다. 실제로 헤더가 전송되지 않을 것이라고 생각합니다.response.getOutputStream 다음에 을 호출합니다. 응답이 전체 페이로드를 버퍼링하여 대기하지 않습니다. 호출자가 해당 헤더를 지정합니다.
+0

위대한 작품! 자,이 문제와 관련하여 질문이 있습니다. 1) 시작시 HttpServletResponse를 설정하면 코드가 영향을받는 이유는 무엇입니까? 2) 일부 컴퓨터에서 이것이 작동하고 일부 컴퓨터에서 작동하지 않는 이유는 무엇입니까 (이전 코드). – krohit

+0

2. "일부 컴퓨터에서이 기능이 작동하고 일부 컴퓨터에서 작동하지 않는 이유는 무엇입니까?"() 어떤 기계를 사용하고 있습니까? 다른 서버 컴퓨터 또는 다른 클라이언트 컴퓨터에서 처리하는 질문에 대해 잘 모르겠습니다. 다운로드 요청? –

+0

답장을 보내 주셔서 감사합니다, Adrian. 컴퓨터 란 다운로드를 처리하는 다른 클라이언트를 의미합니다. (sry, 나는 그것을 지정해야했다). 그러므로 나는 크롬 문제의 결론에 도달했다.) – krohit