JavaWeb中struts2完成文件上傳下載功效實例解析。本站提示廣大學習愛好者:(JavaWeb中struts2完成文件上傳下載功效實例解析)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb中struts2完成文件上傳下載功效實例解析正文
在做B/S體系時,平日會觸及到上傳文件和下載文件,在沒接struts2框架之前,我們都是應用apache上面的commons子項目標FileUpload組件來停止文件的上傳,然則那樣做的話,代碼看起來比擬繁瑣,並且不靈巧,在進修了struts2後,struts2為文件上傳下載供給了更好的完成機制,在這裡我分離就單文件上傳和多文件上傳的源代碼停止一下講授,這裡須要導入文件下載上傳的兩個jar文件,一個是commons-fileupload-1.2.2.jar,另外一個是commons-io-2.0.1.jar
struts2單文件上傳:
起首是一個jsp文件上傳頁面,這個比擬簡略,就是一個表單,外面有個文件上傳框
<!--在停止文件上傳時,表單提交方法必定如果post的方法,由於文件上傳時二進制文件能夠會很年夜,還有就是enctype屬性,這個屬性必定要寫成multipart/form-data, 否則就會以二進制文本上傳到辦事器端--> <form action="fileUpload.action" method="post" enctype="multipart/form-data"> username: <input type="text" name="username"><br> file: <input type="file" name="file"><br> <input type="submit" value="submit"> </form>
接上去是FileUploadAction部門代碼,由於struts2對上傳和下載都供給了很好的練習機制,所以在action這段我們只須要寫很少的代碼就行:
public class FileUploadAction extends ActionSupport { private String username; //留意,file其實不是指前端jsp上傳過去的文件自己,而是文件上傳過去寄存在暫時文件夾上面的文件 private File file; //提交過去的file的名字 private String fileFileName; //提交過去的file的MIME類型 private String fileContentType; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } 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; } @Override public String execute() throws Exception { String root = ServletActionContext.getServletContext().getRealPath("/upload"); InputStream is = new FileInputStream(file); OutputStream os = new FileOutputStream(new File(root, fileFileName)); System.out.println("fileFileName: " + fileFileName); // 由於file是寄存在暫時文件夾的文件,我們可以將其文件名和文件途徑打印出來,看和之前的fileFileName能否雷同 System.out.println("file: " + file.getName()); System.out.println("file: " + file.getPath()); byte[] buffer = new byte[500]; int length = 0; while(-1 != (length = is.read(buffer, 0, buffer.length))) { os.write(buffer); } os.close(); is.close(); return SUCCESS; } }
起首我們要清晰一點,這裡的file其實不是真正指代jsp上傳過去的文件,當文件上傳過去時,struts2起首會尋覓struts.multipart.saveDir(這個是在default.properties外面有)這個name所指定的寄存地位,我們可以新建一個struts.properties屬性文件來指定這個暫時文件寄存地位,假如沒有指定,那末文件會寄存在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目次下,然後我們可以指定文件上傳後的寄存地位,經由過程輸入流將其寫到流外面就好了,這時候我們便可以在文件夾裡看到我們上傳的文件了。
文件上傳後我們還須要將其下載上去,其實struts2的文件下載道理很簡略,就是界說一個輸出流,然後將文件寫到輸出流外面就行,症結設置裝備擺設照樣在struts.xml這個設置裝備擺設文件裡設置裝備擺設:
FileDownloadAction代碼以下:
public class FileDownloadAction extends ActionSupport { public InputStream getDownloadFile() { return ServletActionContext.getServletContext().getResourceAsStream("upload/通信錄2012年9月4日.xls"); } @Override public String execute() throws Exception { return SUCCESS; } }
我們看,這個action只是界說了一個輸出流,然後為其供給getter辦法就行,接上去我們看看struts.xml的設置裝備擺設文件:
<action name="fileDownload" class="com.xiaoluo.struts2.FileDownloadAction"> <result name="success" type="stream"> <param name="contentDisposition">attachment;filename="通信錄2012年9月4日.xls"</param> <param name="inputName">downloadFile</param> </result> </action>
struts.xml設置裝備擺設文件有幾個處所我們要留意,起首是result的類型,之前我們界說一個action,result那邊我們根本上都不寫type屬性,由於其默許是要求轉發(dispatcher)的方法,除這個屬性普通還有redirect(重定向)等這些值,在這裡由於我們用的是文件下載,所以type必定要界說成stream類型,告知action這是文件下載的result,result元素外面普通還有param子元素,這個是用來設定文件下載時的參數,inputName這個屬性就是獲得action中的文件輸出流,名字必定要和action中的輸出流屬性名字雷同,然後就是contentDisposition屬性,這個屬性普通用來指定我們願望經由過程怎樣樣的方法來處置下載的文件,假如值是attachment,則會彈出一個下載框,讓用戶選擇能否下載,假如不設定這個值,那末閱讀器會起首檢查本身可否翻開下載的文件,假如能,就會直接翻開所下載的文件,(這固然不是我們所須要的),別的一個值就是filename這個就是文件鄙人載時所提醒的文件下載名字。在設置裝備擺設完這些信息後,我們就可以過完成文件的下載功效了。
struts2多文件上傳:
其實多文件上傳和單文件上傳道理一樣,單文件上傳曩昔的是單一的File,多文件上傳曩昔的就是一個List<File>聚集或許是一個File[]數組,起首我們來看一下前端jsp部門的代碼,這裡我用到了jquery來完成靜態的添加文件下載框和靜態的刪除下載框:
<script type="text/javascript" src="script/jquery-1.8.1.js"></script> <script type="text/javascript"> $(function() { $("#button").click(function() { var html = $("<input type='file' name='file'>"); var button = $("<input type='button' name='button' value='刪除'><br>"); $("#body div").append(html).append(button); button.click(function() { html.remove(); button.remove(); }) }) }) </script> </head> <body id="body"> <form action="fileUpload2.action" method="post" enctype="multipart/form-data"> username: <input type="text" name="username"><br> file: <input type="file" name="file"> <input type="button" value="添加" id="button"><br> <div></div> <input type="submit" value="submit"> </form> </body>
file的名字必需都定名成file才行,然後處置多文件上傳的action代碼以下:
public class FileUploadAction2 extends ActionSupport { private String username; //這裡用List來寄存上傳過去的文件,file異樣指的是暫時文件夾中的暫時文件,而不是真正上傳過去的文件 private List<File> file; //這個List寄存的是文件的名字,和List<File>中的文件絕對應 private List<String> fileFileName; private List<String> fileContentType; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public List<File> getFile() { return file; } public void setFile(List<File> file) { this.file = file; } public List<String> getFileFileName() { return fileFileName; } public void setFileFileName(List<String> fileFileName) { this.fileFileName = fileFileName; } public List<String> getFileContentType() { return fileContentType; } public void setFileContentType(List<String> fileContentType) { this.fileContentType = fileContentType; } @Override public String execute() throws Exception { String root = ServletActionContext.getServletContext().getRealPath("/upload"); for(int i = 0; i < file.size(); i++) { InputStream is = new FileInputStream(file.get(i)); OutputStream os = new FileOutputStream(new File(root, fileFileName.get(i))); byte[] buffer = new byte[500]; @SuppressWarnings("unused") int length = 0; while(-1 != (length = is.read(buffer, 0, buffer.length))) { os.write(buffer); } os.close(); is.close(); } return SUCCESS; } }
如許異樣將其寫到一個輸入流外面,如許我們便可以在文件夾裡看到上傳的多個文件了
接上去的文件下載就和適才的文件下載如出一轍,struts.xml也是一樣的,這裡就不再反復了
總結:總的來講,struts2供給的文件上傳下載機制簡化了我們許多代碼,我們可以在今後的項目中應用該機制,異樣我們也能夠應用FileUpload組件來停止文件的上傳,這個都是因小我喜好決議!
關於JavaWeb中的文件上傳和下載功效的內容就這麼多,感謝年夜家的浏覽。