1. 程式人生 > >struts實現簡單檔案上傳

struts實現簡單檔案上傳

以前呢 實現一個檔案上傳需要在servlet裡寫很多的程式碼 然後用struts也就兩三行程式碼即可完成操作。

一般struts的action裡要有一個公用的類 裡面放著那些資料處理返回碼跟資訊返回碼等等

public class BaseAction implements ServletRequestAware,ServletResponseAware{

	//一些必須的屬性 拿到request的一些屬性
	protected HttpServletRequest request;
	protected HttpServletResponse response;
	protected HttpSession session;
	protected ServletContext application;
	
	//每一個action裡方法處理完返回的結果碼
	protected final String SUCCESS="success";//處理成功
	protected final String FAIL="fail";//或失敗
	protected final String LIST="list";//查詢所有的結果碼
	protected final String PREADD="preAdd";//去增加介面結果碼
	protected final String PREUPDATE="preupdate";//去修改介面結果碼
	protected final String TOLIST="tolist";//增刪改返回進去的結果碼
	//返回的結果集
	protected Object result;
	protected Object msg;
	protected int code;
	
	
	
	public Object getResult() {
		return result;
	}

	public void setResult(Object result) {
		this.result = result;
	}

	public Object getMsg() {
		return msg;
	}

	public void setMsg(Object msg) {
		this.msg = msg;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	@Override
	public void setServletResponse(HttpServletResponse response) {
		// TODO Auto-generated method stub
		this.response=response;
	}

	@Override//在方法裡給他們賦值
	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		this.request=request;
		this.session=request.getSession();
		this.application=request.getServletContext();
	}

}

檔案上傳三種方式

1:上傳圖片以二進位制形式儲存到資料庫

2.將圖片上傳到指定伺服器的硬碟(cpu快 硬碟教大)

3.將圖片上傳到tomcat所在伺服器(對應靜態資源伺服器——上線不重啟)

下面這種就是用的第三種來事例  通過虛擬路徑拿到真實路徑

然後寫檔案上傳的程式碼邏輯:一般來說檔案上傳應該是從資料庫拿值 我這就在本地設定了圖片的名字了

public class FileAction extends BaseAction{
	private File file;//jsp頁面傳過來的檔案   三個必須的屬性
	private String fileFileName;//檔名
	private String fileContentType;//檔案型別

	private String dir="/upload";//虛擬路徑
	
	
	//封裝
	public File getFile() {
		return file;
	}

	public void setFile(File file) {
		this.file = file;
	}

	public String getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}

	public String getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}

	//檔案上傳
	public String upload() {
		System.out.println("filefilename:"+fileFileName);//輸出那個檔名字
		System.out.println("filetype:"+fileContentType);//輸出拿到的型別
//這裡說實話就兩句程式碼實現了上傳的功能
		String realpath=getrealpath(dir+"/"+fileFileName);//用下面的方法拿到虛擬路徑加這個檔名
		System.out.println("realpath:"+realpath);
		try {
			FileUtils.copyFile(file, new File(realpath));//這個檔案上傳到新的檔案路徑
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "success";
		
	}
	
	/**
	 * 獲取資料夾真實路徑
	 * @param path
	 * @return
	 */
	public String getrealpath(String path) {//獲取全項路徑
		return this.request.getServletContext().getRealPath(path);
	}
	
	//下載圖片
	public String saveAs() {
		//這裡應該從資料庫拿值
				String fileName="stationmaster_img.png";
				String filetypes="img/png";
				response.setContentType(filetypes);//設定圖片型別
				//開啟圖片不要加這個attachment;下載需要
				response.setHeader("Content-Disposition","attachment;filename=" + fileName);//新增標頭檔案
				String realpath=getrealpath(dir+"/"+fileName);//用下面的方法拿到虛擬路徑加這個檔名
				//從伺服器獲取到的圖片下載到本地
				try {
					FileUtils.copyFile(new File(realpath), response.getOutputStream());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return null;
	}
	
	
	//開啟圖片
	public String openAs() {
		//這裡應該從資料庫拿值
		String fileName="stationmaster_img.png";
		String filetypes="img/png";
		response.setContentType(filetypes);//設定圖片型別
		//開啟圖片不要加這個attachment;下載需要
		response.setHeader("Content-Disposition","filename=" + fileName);//新增標頭檔案
		String realpath=getrealpath(dir+"/"+fileName);//用下面的方法拿到虛擬路徑加這個檔名
		//從伺服器獲取到的圖片寫到本地
		try {//伺服器到本地輸出這個檔案
			FileUtils.copyFile(new File(realpath), response.getOutputStream());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

}

頁面上需要寫一個上傳檔案的檔案選擇器

<h2>檔案上傳</h2>//呼叫這個路徑方法下載圖片然後可以跳到那個介面
<form action="${pageContext.request.contextPath}/sy/fileAction_upload.action" enctype="multipart/form-data" method="post">
<input type="file" name="file">
<input type="submit">
</form>




//這裡是struts配置裡已經配置好了圖片下載過去的路徑
	<action name="fileAction_*" class="com.struts.action.FileAction" method="{1}">
	<!-- 如果這個action要用到就呼叫這個攔截器 -->
	<!-- <interceptor-ref name="oneinterceptor"></interceptor-ref> -->
	<result name="success">/a.jsp</result>
	</action>

這邊便是圖片展示的地方

<body>
來見我啊!這是:${rs}
檢視圖片 這就是檢視跟下載然後呼叫的方法
<img alt="" src="${pageContext.request.contextPath}/sy/fileAction_openAs.action">
<a href="${pageContext.request.contextPath}/sy/fileAction_saveAs.action">下載圖片</a>
</body>

基本上就可實現簡單的圖片上傳下載功能 。