0

Tomcat 5.5、JSF 1.2、Spring 3 を使用しています

ディスクからブラウザにファイルを渡すサーブレットがあります。この問題は、そのファイルのMIME タイプが text/htmlの場合に発生します。

そのファイルのエンコーディングがわからないため、正しい応答エンコーディングを設定できません。

それがサーブレットのコードです

    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タグがわずかに変更されています。サーブレットコンテナがそれを行うと思いますが、よくわかりません。

ファイルのエンコードを検出して、それを応答のエンコードとして設定する方法、または少なくとも応答ストリームの再エンコードを防止する方法はありますか?

少なくとも、誰がそのバイトストリーム、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 に答える