Struts2使用註解實現文件的上傳與下載(二)

        接上篇Struts2使用註解實現文件的上傳與下載(一),這次介紹使用註解實現文件下載,基本配置與之前的一樣,這裏重點講下載的Action寫法。

        文件下載的Action:DownloadAction.java

package com.figo.action;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Validateable;
import com.opensymphony.xwork2.ValidationAwareSupport;

/**
 * 所下載文件相關的的幾個屬性:文件格式 contentType, 
 * 獲取文件名的方法inputName,
 * 文件內容(顯示的)屬性contentDisposition, 
 * 限定下載文件 緩衝區的值bufferSize
 * */

@Results({ @Result(name = "success", type = "stream", params = { "contentType",
		"application/octet-stream;charset=ISO8859-1", "inputName",
		"inputStream", "contentDisposition",
		"attachment;filename=\"Readme.txt\"", "bufferSize", "4096" }) })
public class DownloadAction extends ActionSupport {

	private static final long serialVersionUID = 8784555891643520648L;
	private String STORAGEPATH = "/upload/Readme.txt";

	private String fileName;// 初始的通過param指定的文件名屬性
	private String storageId;
	private String inputPath;// 指定要被下載的文件路徑

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public void setInputPath(String inputPath) {
		this.inputPath = inputPath;
	}

	public String getStorageId() {
		return storageId;
	}

	public void setStorageId(String storageId) {
		this.storageId = storageId;
	}

	// 如果下載文件名爲中文,進行字符編碼轉換
	public String getDownloadFileName() {
		String downloadFileName = fileName;

		try {
			downloadFileName = new String(downloadFileName.getBytes(),
					"ISO8859-1");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		return downloadFileName;
	}

	public InputStream getInputStream() throws Exception {
		/**
		 * 下載用的Action應該返回一個InputStream實例, 
		 * 該方法對應在result裏的inputName屬性值爲targetFile
		 **/
		return ServletActionContext.getServletContext().getResourceAsStream(
				STORAGEPATH);
	}

	public String execute() throws Exception {
		return SUCCESS;
	}

}

        代碼其實很簡單,最關鍵的就是getInputStream()方法,返回一個InputStream實例,還有就是@Results的配置。

        測試頁面:download.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Download</title>
</head>
<body>
	<s:a href="download.action">Download</s:a>
</body>
</html>

        結果如下:

        最後附代碼:http://download.csdn.net/detail/sxwyf248/4462899

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章