先寫個type="file",看看Action抓到的情形
upload.jsp
<form action="upload!upload.action" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile" /><br /> <input type="submit" /> </form>
struts.xml,因為action沒有result,待會會出錯,但目前只要看控制台的訊息就好
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.custom.i18n.resources" value="Message" /> <constant name="struts.devMode" value="true" /> <package name="basicstruts2" extends="struts-default" namespace="/struts2"> <action name="upload" class="action.UploadAction"></action> </package>
UploadAction.java,只要繼承ActinSupport
public class UploadAction extends ActionSupport { private File uploadFile; //setter即可 public String upload() { System.out.println("uploadFile=" + uploadFile); return null; } }
抓到的檔案副檔名為tmp,而且控制台部分訊息出現「'uploadFileContentType' on 'class action.UploadAction」和「'uploadFileFileName' on 'class action.UploadAction」的訊息,表示要增加這兩個屬性,所以Action最後的結果要改成如下的方式:
public class UploadAction extends ActionSupport { private File uploadFile; private String uploadFileContentType; private String uploadFileFileName; //三個屬性都給setter即可 public String upload() { System.out.println("uploadFile=" + uploadFile); System.out.println("uploadFileContentType=" + uploadFileContentType); System.out.println("uploadFileFileName=" + uploadFileFileName); return null; } }
這裡也有說明
知道這三個屬性的關係後,重新再寫一次
upload.jsp
<%@ page isELIgnored="false"%> ${uploadMsg} <form action="upload!upload.action" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile" /><br /> <input type="submit" /> </form>
struts.xml,constant可以在src下建立一個struts.properties,也是一樣,目前這隻saveDir還沒有作用
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.custom.i18n.resources" value="Message" /> <constant name="struts.devMode" value="true" /> <constant name="struts.multipart.saveDir" value="D:\testStruts2" /> <constant name="struts.multipart.maxSize" value="2097152" /> <package name="basicstruts2" extends="struts-default" namespace="/struts2"> <action name="upload" class="action.UploadAction"> <result name="success">/struts2/upload.jsp</result> </action> </package>struts2-core-2.x.x.jar\org.apache.strtus2\default.properties可以找到constant的所有資訊
2097152單位是bit,除兩次1024就是2MB
UploadAction.java
private File uploadFile; private String uploadFileContentType; private String uploadFileFileName; //三個屬性都給setter即可 public String upload() { HttpServletRequest request = ServletActionContext.getRequest(); //可以到「tomcat目錄\conf\web.xml」可看到很多xxx/xxx List<String> list = Arrays.asList(new String[] { "image/jpeg", "image/bmp", "image/tiff" }); if (list.contains(this.uploadFileContentType)) { ServletContext context = ServletActionContext.getServletContext(); StringBuffer path = new StringBuffer(); // 取個資料夾名稱放上傳的檔案 path.append(context.getRealPath("/uploadPlace")); // 用唯一值命名主檔名 path.append(File.separator + UUID.randomUUID() + "."); // 取原本的副檔名 path.append(this.uploadFileFileName .substring(this.uploadFileFileName.lastIndexOf(".") + 1)); FileControl.saveFile(this.uploadFile, path.toString()); request.setAttribute("uploadMsg", "上傳成功!"); } else { request.setAttribute("uploadMsg", "上傳非圖片格式!"); } return SUCCESS; }
FileControl.java,裡面只有兩個靜態方法
public static boolean saveFile(File file, String path) { File outFile = new File(path); if (!outFile.getParentFile().exists()) { outFile.getParentFile().mkdirs(); } InputStream input = null; OutputStream output = null; try { input = new FileInputStream(file); output = new FileOutputStream(outFile); byte[] data = new byte[1024]; int temp = 0; while ((temp = input.read(data)) != -1) { output.write(data, 0, temp); } input.close(); output.close(); return true; } catch (Exception e) { e.printStackTrace(); } return false; } public static boolean deleteFile(String path) { File file = new File(path); if (file.exists()) { file.delete(); return true; } return false; }這個class就隨個人發揮了
以上雖然完成了功能,但是是屬於自己寫的苦功,所以stuts.xml的saveDir(儲存路徑)沒有效果,當然路徑也可以用Action裡的ServletActionContext.getServletContext().getRealPath("")取得檔案內容,然後進一步取得路徑
※用struts2的攔截器來達成上傳的功能
upload.jsp${fieldErrors},<br /> ${fieldErrors['uploadFile']},<br /> ${fieldErrors['uploadFile'][0]}<br /> <form action="upload!upload.action" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile" /><br /> <input type="submit" /> </form>
struts.xml,saveDir是暫存目錄,不加會在control有警告「Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir」,但不影響上傳功能,而這個資料夾,上傳完成後,我也沒看到有什麼檔案在裡面
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.custom.i18n.resources" value="Message" /> <constant name="struts.devMode" value="false" /> <constant name="struts.multipart.saveDir" value="D:/testStruts2" /> <package name="basicstruts2" extends="struts-default" namespace="/struts2"> <action name="upload" class="action.UploadAction"> <interceptor-ref name="fileUpload"> <param name="allowedTypes"> image/jpeg,image/bmp,image/tiff,image/png,image/gif </param> <param name="maximumSize">1048576</param> </interceptor-ref> <interceptor-ref name="basicStack"/> <result name="success">/struts2/upload.jsp</result> </action> </package>
UploadAction
private File uploadFile; private String uploadFileContentType; private String uploadFileFileName; //都給setter即可 public String upload() { ServletContext context = ServletActionContext.getServletContext(); StringBuffer path = new StringBuffer(); path.append(context.getRealPath("/uploadPlace")); path.append(File.separator + this.uploadFileFileName); System.out.println("path=" + path); FileControl.saveFile(this.uploadFile, path.toString()); return SUCCESS; }
Message.properties,顯示錯誤訊息用,不加也有預設的錯誤訊息
struts.messages.error.uploading=aaa struts.messages.error.file.too.large=bbb struts.messages.error.content.type.not.allowed=ccc struts.messages.error.file.extension.not.allowed=ddd
※多檔案上傳
以上個檔案為例,其實只要變成陣列的型式就可以了upload.jsp
<form action="upload!upload.action" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile" />${fieldErrors['uploadFile'][0]}<br /> <input type="file" name="uploadFile" />${fieldErrors['uploadFile'][1]}<br /> <input type="file" name="uploadFile" />${fieldErrors['uploadFile'][2]}<br /> <input type="submit" /> </form>
UploadAction.java
private File[] uploadFile; private String[] uploadFileContentType; private String[] uploadFileFileName; //都給setter即可 public String upload() { ServletContext context = ServletActionContext.getServletContext(); for (int i = 0; i < uploadFile.length; i++) { StringBuffer path = new StringBuffer(); path.append(context.getRealPath("/uploadPlace")); path.append(File.separator + this.uploadFileFileName[i]); System.out.println("path=" + path); FileControl.saveFile(this.uploadFile[i], path.toString()); } return SUCCESS; }
沒有留言:
張貼留言