2010-03-17 3 views
1

서블릿을 사용하여 서버에서 컴퓨터로 일부 파일을 다운로드하고 있습니다. 서블릿은 MIME 유형 및 기타 사항을 처리 한 다음 대화 상자를 열고 파일 (열기, 저장, 취소)과 관련된 작업을 시작합니다. FireFox에서 사용할 때 제대로 작동하지만 IE6에서 사용할 때 파일이 다운로드되지만 내 서블릿의 URL과 404 오류가있는 새 창이 나타납니다. 나는 웹을보고 있지만, 이유에 대한 단서를 찾지 못했습니다.서블릿 : 파일을 다운로드 할 때 IE6에서 http 404 오류가있는 새 창 열기 (단, 파일 다운로드)

public void doGet( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 
// envoi du fichier 
BufferedInputStream bIn = null; 
BufferedOutputStream bOut = null; 
int bytesRead; 
byte[] buffer = new byte[2048]; 
try { 
    String nomFichier = <my_filename>; 
    // encodage des caractères hors [a-Z, 0-9] pis transformation des espace(+) pour l'URL 
    String path = <my_path_to_download> + StringUtils.replace(URLEncoder.encode(nomFichier, "UTF-8"), "+", "%20"); 

    URL url = new URL(path); 
    // Test si le fichier bien présent sur le serveur 
    if (((HttpURLConnection) url.openConnection()).getResponseCode() != HttpURLConnection.HTTP_OK) { 
     throw new FileNotFoundException(); 
    } 
    bIn = new BufferedInputStream(url.openStream()); 

    String extension = StringUtils.getFilenameExtension(nomFichier).toLowerCase(); 
    // choix du type MIME selon l'extension du fichier 
    if (Extensions.PDF.equals(extension)) { 
     res.setContentType("application/pdf"); 
    } else if (Extensions.WORD.equals(extension)) { 
     res.setContentType("application/msword"); 
    } else if (Extensions.HTM.equals(extension)) { 
     res.setContentType("text/htm"); 
    } else if (Extensions.HTML.equals(extension)) { 
     res.setContentType("text/html"); 
    } else { 
     LOGGER.error("Format de fichier non géré : " + extension); 
     throw new RuntimeException("Format de fichier non géré : " + extension); 
    } 
    // n'ouvre pas dans le navigateur et renseigne le nom de fichier pour "Save as..." 
    res.setHeader("Content-Disposition", "attachment; filename=\"" + nomFichier + "\";"); 

    // lecture/écriture des données 
    bOut = new BufferedOutputStream(res.getOutputStream()); 
    while (-1 != (bytesRead = bIn.read(buffer, 0, buffer.length))) { 
     bOut.write(buffer, 0, bytesRead); 
    } 
} catch (Exception e) { 
    LOGGER.error("Erreur à la récupération du fichier " + nomFichier, e.getCause()); 
    res.sendError(HttpServletResponse.SC_NOT_FOUND); 
} finally { 
    if (bIn != null) 
     bIn.close(); 
    if (bOut != null) 
     bOut.close(); 
} 

}

보다 효율적으로 할 수있는 몇 가지 차별화
+0

가능한 경우 링크가 있습니까? – Grumpy

답변

1

(예 ServletContext#getMimeType() 등), 코드가 잘 보이는 당신이 할 수있는 (: 도움이된다면 여기

, 내 코드입니다 필요한 경우 this example에서 아이디어를 얻으십시오.

문제는 클라이언트 측에서 분명합니다. 먼저 HTTP 요청을 시작하지 않고 HTTP (404) 응답을받을 수 없습니다. 클라이언트는 분명히 하나가 아닌 두 개의 HTTP 요청을 서버 측에 보내고 있습니다. 가능한 원인 중 하나는 링크의 onclick에 자바 스크립트 함수를 추가했거나 자바 스크립트 코드의 IE6 특정 버그로 인해 false을 반환하지 않는 버튼을 추가 한 것입니다. 다른 가능한 원인은 링크 또는 양식에 target="_blank"을 사용했지만 다운로드 링크/버튼에는 완전히 필요하지 않습니다. 다른 이유는 Javascript window.open()을 사용하여 다운로드 요청을 발생 시켰지만 완전히 불필요한 것도 마찬가지입니다.

서블릿을 가리키는 action 또는 "일반 바닐라"링크를 가진 "일반 바닐라"형식을 가지고 있으며 그 중 href이 서블릿을 가리 킵니다. Content-Disposition: attachment 헤더는 브라우저가 다른 이름으로 저장 대화 상자를 강제로 나타냅니다. 여기서는 자바가 전혀 없으며 target 속성이 필요합니다.

+0

좋아, 문제는 servelt에서 오는 것이 아니라 서블릿을 호출하는 방식으로 : navigateToUrl (Flex)를 사용하고 있었기 때문에 새 창에서 열었습니다. 그래서 정상적으로 문제가 생겼습니다. 빈 상태 였기 때문에 새 창을 닫으면 올바르게 작동하지 않는 FF였습니다. 우리는 FileReference.download()의 새로운 보안 정책 인 navigateToUrl을 사용하여 간접 호출을 좋아하지 않았습니다 ... 그러나 우리는 해결 방법을 찾았지만 이제는 모든 것이 좋습니다 :) 고맙습니다 올바른 길로 나를 인도하는 해답 –

관련 문제