Liferay中的文件下載處理

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;
	}

}



發佈了385 篇原創文章 · 獲贊 25 · 訪問量 200萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章