Struts2中的檔案上傳,方式很多,大體原理不變。一種是通過POST請求上傳,另一種Struts2封裝好的欄位驅動的方式上傳。
1.第一種:
public String uploadImage() { boolean result = false; /** *擷取request對象,在Struts2或者Servlet中同理 */ HttpServletRequest req = ServletActionContext.getRequest(); DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setRepository(new File(getUploadFileSavePath(req))); factory.setSizeThreshold(1024 * 1024 * 2); ServletFileUpload upload = new ServletFileUpload(factory); List<?> items = null; try { items = upload.parseRequest(req); } catch (FileUploadException e1) { e1.printStackTrace(); } for (int i = 0; i < items.size(); i++) { FileItem item = (FileItem) items.get(i); if (item.isFormField()) { continue; } else { String fileName = item.getName(); /** *StringUtils工具產生時間戳記作為檔案名稱,可擴充 */ String dstFile = StringUtils.timeStamp() + fileName.substring(fileName.lastIndexOf('.')); String dstFileName = getUploadFileSavePath(req) + File.separator + dstFile; FileOutputStream fos; try { fos = new FileOutputStream(dstFileName); if (item.isInMemory()) { InputStream in; in = item.getInputStream(); byte[] btn = new byte[1024]; int size; while ((size = in.read(btn)) > 0) { fos.write(btn, 0, size); } in.close(); fos.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } }
依賴的上傳組件是:org.apache.commons.fileupload
原理:通過請求來判斷Form中的欄位類型,屬於檔案類型則上傳檔案。
2.第二種:
public class UploadAction extends ActionSupport { private static final long serialVersionUID = 7545315675701301471L; /** * 上傳檔案 */ private File ccImage; /** * 下面的兩個欄位因ccImage欄位存在,而且命名分別是xxxContentType,xxxFileName */ /** * 檔案類型Meta資訊) */ private String ccImageContentType; /** * 上傳的檔案名稱 */ private String ccImageFileName; private HttpServletRequest request = ServletActionContext.getRequest(); /** * 擷取工程的訪問URL根路徑:例如:http://127.0.0.1:8080/工程名 */ private String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); /** * 上傳檔案 * * @return */ public String upload() { boolean result = false; String dstFile = StringUtils.timeStamp() + ccImageFileName.substring(ccImageFileName.lastIndexOf('.')); String dstFileName = getUploadFileSavePath() + File.separator + dstFile; File destFile = new File(dstFileName); try { FileUtils.copyFile(ccImage, destFile); } catch (IOException e) { e.printStackTrace(); } return result ? Action.SUCCESS : Action.ERROR; } /** * 擷取上傳檔案的路徑 * * @return */ private String getUploadFileSavePath() { @SuppressWarnings("deprecation") /** * Const.UPLOAD_HEAD_PATH:可配置的變數 */ String path = request.getRealPath(Const.UPLOAD_HEAD_PATH); File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } return path; } /** * Struts2對於上傳檔案進行了封裝,set方法必須存在,通過set方法和為欄位進行賦值 * @return */ public String getCcImageContentType() { return ccImageContentType; } public void setCcImageContentType(String ccImageContentType) { this.ccImageContentType = ccImageContentType; } public File getCcImage() { return ccImage; } public void setCcImage(File ccImage) { this.ccImage = ccImage; } public String getCcImageFileName() { return ccImageFileName; } public void setCcImageFileName(String ccImageFileName) { this.ccImageFileName = ccImageFileName; } public String getBasePath() { return basePath; } public void setBasePath(String basePath) { this.basePath = basePath; }}
上面的UploadAction類中的屬性有File,String其中後兩個屬性因為第一個屬性存在而存在,有一定的關聯性,這裡既可以看成是屬性驅動,也可以是模型驅動。Struts2對檔案上傳的這個過程進行了很好的封裝,這裡注意屬性的命名和set方法即可。
Struts上傳檔案配置:
<!-- 指定允許上傳的檔案最大位元組數。預設值是2097152(2M) --><constant name="struts.multipart.maxSize" value="2097152" />
Action的配置
<interceptor-ref name="fileUpload"> <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param></interceptor-ref><interceptor-ref name="defaultStack" />
關於Struts的檔案上傳攔截器參見類:
org.apache.struts2.interceptor.FileUploadInterceptor
末了:寫這篇文章,不在內容,在意義,在開發中上傳檔案遇到了一些問題,百度了一下,很多都是泊來品,於是回到官方文檔,很多問題都是能解決了,紀念一下,警示自己少百度,少Google,溯本逐源才能做好真學問。
本文出自 “野馬紅塵” 部落格,謝絕轉載!