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>
...
前もって感謝します。