0

我使用 tomcat 5.5、JSF 1.2、Spring 3

我有将文件从磁盘传递到浏览器的 servlet。当该文件具有text/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时,才会出现该问题。在我将它传递给响应outputstream之后,不知何故该字节流被重新编码。如下所示,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>
...

提前致谢。

4

1 回答 1

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"));
于 2012-10-02T13:49:39.060 回答