2012-10-02 61 views
0

我使用tomcat 5.5,JSF 1.2,Spring 3如何在下載文本/ html文件時阻止servlet響應編碼? Spring + JSF

我有從磁盤傳遞文件到瀏覽器的servlet。該文件有文本/ html MIME類型時發生此問題。

我不知道該文件可能有什麼編碼,所以我無法設置正確的響應編碼。

這是servlet的

private void handleFILERequest(final FacesContext context) throws UnsupportedEncodingException { 
    String filePath = AbstractBean.getStrRequestScopeAttribute(FILE_PATH); 
    String mimeType = AbstractBean.getStrRequestScopeAttribute(FILE_MIME_TYPE); 
    String fileName = AbstractBean.getStrRequestScopeAttribute(FILE_NAME); 
    byte[] data = getFile(filePath); 

    HttpServletResponse response = AbstractBean.getResponse(); 
    response.reset(); 
    response.setContentType(mimeType); 
    response.setContentLength(data.length); 
    if (fileName == null || "".equals(fileName)) { 
     response.addHeader("Content-Disposition", "attachment; filename=\"downloadFile\""); 
    } else { 
     response.addHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\""); 
    } 
    try { 
     response.getOutputStream().write(data); 
    } catch (Exception exception) { 
     LOG.error(exception.getMessage()); 
    } 
    context.responseComplete(); 
} 


private byte[] getFile(final String path) { 
    return IOUtils.readFile(path); 
} 

這一問題的代碼只出現在文件的MIME類型text/html的。不知何故,在我將它傳遞給響應輸出流後,字節流被重新編碼。此外,html標籤會稍微更改,如下所示。我認爲這個servlet容器是這樣做的,但我不確定。

是否有辦法檢測文件編碼設置爲響應編碼或至少防止進一步重新編碼響應流?

至少我想知道誰更改了字節流,tomcat,spring,jsf或...?

這裏來在磁盤上的文件的一部分,並在瀏覽器中生成的下載文件:在磁盤上

文件(西里爾符號,但沒有定義編碼):

<html> 
    <head> 
    <link HREF="/vestnik/csstyles/article.css" REL="stylesheet"> 
    <title>Л.О. Бутакова. Опыт классификации ошибок ...</title> 
    </head> 
... 

文件,我在瀏覽器中得到:

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <link HREF="/vestnik/csstyles/article.css" REL="stylesheet"> 
    <title>пїЅ.пїЅ. пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ. пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ ...</title> 
    </head> 
... 

在此先感謝。

+0

JSF沒有做到這一點。 getFile()究竟做了什麼? – BalusC

+0

return IOUtils.readFile(path); – Ananda

回答

0

您可以使用UTF-8編碼

String str = new String(data); //set your data in this object 
response.setContentType("text/plain"); 
InputStream input = new ByteArrayInputStream(str.getBytes("UTF8")); 
+0

但是** text/plain **對於html文件好嗎? – Ananda

相關問題