/**
* {@.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;
}