struts實現簡單檔案上傳
阿新 • • 發佈:2018-12-22
以前呢 實現一個檔案上傳需要在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>
基本上就可實現簡單的圖片上傳下載功能 。