Liferay中的文件下載在ServletResponseUtil類中彙總了方法。
但是在IE6,7中超長的文件名會被截掉。
還有一個問題就是safari下載出xxx.html的形式。不能夠正常下載。
爲了解決上面的問題,可以自己把ServletResponseUtil類中的setHeaders方法重新寫一下。
public class MyServletResponseUtil extends ServletResponseUtil {
private static Log _log = LogFactoryUtil.getLog(MyServletResponseUtil.class);
/** MSIE 6.0 or 7.0 */
private static final Pattern MSIE6or7 = Pattern.compile(".*MSIE (6.0|7.0).*");
public static String encodeFileName(final HttpServletRequest request,
final String fileName) throws UnsupportedEncodingException {
String encodedFileName;
String userAgent = request.getHeader("User-Agent");
// IE 6/IE 7
if (BrowserSnifferUtil.isIe(request)
&& MSIE6or7.matcher(userAgent).matches() == true) {
// 日語的情況下
byte[] byteFileName = fileName.getBytes("Windows-31J");
encodedFileName = new String(byteFileName, "ISO-8859-1");
} else {
// IE 以外
encodedFileName = HttpUtil.encodeURL(fileName, true);
}
return encodedFileName;
}
public static void sendFile(HttpServletRequest request,
HttpServletResponse response, String fileName, byte bytes[],
String contentType) throws IOException {
setHeaders(request, response, fileName, contentType);
write(response, bytes);
}
public static void sendFile(
HttpServletRequest request, HttpServletResponse response,
String fileName, byte[] bytes)
throws IOException {
sendFile(request, response, fileName, bytes, null);
}
protected static void setHeaders(HttpServletRequest request,
HttpServletResponse response, String fileName, String contentType) {
if (_log.isDebugEnabled())
_log.debug((new StringBuilder("Sending file of type ")).append(
contentType).toString());
if (Validator.isNotNull(contentType)) {
response.setContentType(contentType);
}
response.setHeader("Cache-Control", "private");
response.setHeader("Pragma", "no-cache");
if (Validator.isNotNull(fileName)) {
String contentDisposition = (new StringBuilder("attachment; filename=\"")).append(fileName).append("\"").toString();
boolean ascii = true;
for (int i = 0; i < fileName.length(); i++) {
if (Validator.isAscii(fileName.charAt(i)))
continue;
ascii = false;
break;
}
if (!ascii) {
// URL encode
//String encodedFileName = HttpUtil.encodeURL(fileName, true);
String encodedFileName = null;
try {
encodedFileName = encodeFileName(request, fileName);
} catch (UnsupportedEncodingException e) {
encodedFileName = HttpUtil.encodeURL(fileName, true);
}
//IE
if (BrowserSnifferUtil.isIe(request)) {
contentDisposition = (new StringBuilder("attachment; filename=\"")).append(encodedFileName).append("\"").toString();
}
else if (Validator.isNotNull(fileName)) {
//Safari
if (isSafari(request.getHeader("User-Agent"))) {
try {
fileName = new String(fileName.getBytes("UTF-8"), "8859_1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
contentDisposition = (new StringBuilder("attachment; filename=\"")).append(fileName).append("\"").toString();
} else {
//Firefox,Chrome
contentDisposition = (new StringBuilder("attachment; filename*=UTF-8''")).append(encodedFileName).toString();
}
}
}
String extension = GetterUtil.getString(FileUtil.getExtension(fileName)).toLowerCase();
String mimeTypesContentDispositionInline[] = (String[]) null;
try {
mimeTypesContentDispositionInline = PropsUtil.getArray("mime.types.content.disposition.inline");
} catch (Exception _ex) {
mimeTypesContentDispositionInline = new String[0];
}
if (ArrayUtil.contains(mimeTypesContentDispositionInline, extension))
// 在瀏覽器裏面顯示。後綴設置在 mime.types.content.disposition.inline 這個變量中定義。
contentDisposition = StringUtil.replace(contentDisposition,"attachment; ", "inline; ");
response.setHeader("Content-Disposition", contentDisposition);
}
}
public static boolean isSafari(String sUserAgent) {
Pattern pattern = Pattern.compile(".*((Version/)+[0-9]\\.?[0-9]?\\.?[0-9]? Safari).*");
Matcher matcher = pattern.matcher(sUserAgent);
boolean bMatch = matcher.matches();
return bMatch;
}
}