文件下载时 文件名称乱码问题 包含各种浏览器

/**
* {@.CN 文件的下载.}
* {@.JP ファイルをダウンロードする.}
*
* @param response : HttpServletResponse
* {@.CN HttpServletResponse}
* {@.JP HttpServletResponse}
* @param fileName : String
* {@.CN 文件在服务器上的名字(包含绝对路径)}
* {@.JP ファイル名}
* @param originalFileName : String
* {@.CN 文件的原始文件名加扩展名}
* {@.JP ファイルの拡張子}
* @param fileSize : long
* {@.CN 文件的原始大小}
* {@.JP ファイルのサイズ}
* @param decrypt : boolean
* {@.CN 文件是否加密}
* {@.JP ファイルは暗号化かどうか}
*/

private static void doDownload(HttpServletRequest request, HttpServletResponse response,

        String fileName, String originalFileName, long fileSize,
        boolean decrypt) {
File file = new File(fileName);
if (!file.exists() || !file.isFile()) {
throw new SystemException(PropertiesFile.ERR003, fileName);
}
response.setHeader("Content-Type", "application/octet-stream");

String tempFileName = null;
// [A] [P130459] Start.
if (originalFileName != null) {
originalFileName = originalFileName.replaceAll("\r", "");
originalFileName = originalFileName.replaceAll("\r", "");
}
// [C] [P130085] Start.
if (ProcessUtil.isMSIE6(request) || ProcessUtil.isMSIE7(request)// [C] [P130001]
|| ProcessUtil.isFirefox(request) || ProcessUtil.isSafari(request)) { // [C] [P130001]

String lang = ProcessUtil.getBrowserLanguage(request);
if (ProcessUtil.isFirefox(request)) { // [A] [P130001]
originalFileName = originalFileName.replace(ConstantManager.BLANK, ConstantManager.UNDERLINE); // [A] [P130001]
} // [A] [P130001]

tempFileName = convertFileName(lang, originalFileName);


} else if (ProcessUtil.isMSIE8(request)) {
tempFileName = encodeFileName(originalFileName, ConstantManager.CHARSET);
} else {
tempFileName = encodeFileName(originalFileName, ConstantManager.CHARSET);
}
// [C] [P130085] End.

response.setHeader("Content-Disposition", "attachment; filename=" + tempFileName);
if (fileSize != 0) {
response.setHeader("Content-Length", Long.toString(fileSize));
}


if (!decrypt && fileSize == 0) {
response.setHeader("Content-Length", Long.toString(file.length()));
}


InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(file);
out = response.getOutputStream();


if (decrypt) {
decryptRead(in, out);
} else {
copyInToOut(in, out);
}
} catch (FileNotFoundException e) {
throw new SystemException(e);
// } catch (ClientAbortException e) {
// e.printStackTrace();
// } catch (SocketException e) {
// e.printStackTrace();
// [C] [P120032] Start.
} catch (Exception e) {
throw new SystemException(e);
} catch (Throwable e) {
throw new SystemException(e);
// [C] [P120032] End.
} finally {
// [C] [P130085] Start.
try {
close(in);
close(out);
} finally {
lockInstance.releaseReadLock(fileName);
}
// [C] [P130085] End.
}

}


public static String convertFileName(String language, String fileName) {
String result = null;
try {
if (fileName != null && fileName.length() > 0) {
int lang = StringUtil.checkStringLanguage(language, fileName);
if (lang == StringUtil.STRING_LANGUAGE_JP) {
fileName = fileName.replace(";", "_");
result = new String(fileName.getBytes("MS932"), "ISO-8859-1");
//length = FILE_LENGTH;
} else if (lang == StringUtil.STRING_LANGUAGE_CN) {
fileName = fileName.replace(";", "_");
result = new String(fileName.getBytes("GB2312"), "ISO-8859-1");
} else if (lang == StringUtil.STRING_LANGUAGE_EN) {
result = encodeFileName(fileName, "utf-8");
} else {
String tempFileName = fileName;
String ext = fileName.substring(fileName.lastIndexOf("."));
tempFileName = fileName.substring(0, fileName.lastIndexOf("."));
if (tempFileName.length() > 17) {
tempFileName = tempFileName.substring(0, 17);
}
result = encodeFileName(tempFileName + ext, "utf-8");
}
} else {
result = fileName;
}
} catch (UnsupportedEncodingException e) {
result = null;
}
return result;
}



public static String encodeFileName(String fileName, String charset) {
String result = null;
try {
if (fileName != null && charset != null) {
if ("utf-8".equals(charset)) {
result = URLEncoder.encode(fileName, charset);
result = result.replace("+", " ");
} else {
result = new String(fileName.getBytes(charset), charset);
}
}
} catch (UnsupportedEncodingException e) {
result = null;
}


return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值