1.在大多數應用中,都有文件上傳功能。有兩種文件上傳的方式,一種是自己去解析http協議,獲取文件上傳的內容。另一種是通過第三方插件來實現文件上傳。第三方插件一般有兩種,smartfileupload(上傳小文件效率比較好,沒有更新),commons-fileupload。
2.在servlet中實現文件上傳的步驟:
a) 導入jar包 commons-fileupload, common-io ;
b) 編寫jsp 頁面,表單提交必須是 post ,enctype="multipart/form-data"
<body> <form action="fileupload" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="name"/><br> 文件:<input type="file" name="file"/><input type="submit" value="上傳"/> </form> </body
c) 編寫servlet
@WebServlet("/fileupload") public class FileUploadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //上傳文件存放位置 String path = req.getServletContext().getRealPath("/upload"); //創建磁盤目錄工廠 該工廠可以設置 臨時文件大小,還可以設置臨時目錄 DiskFileItemFactory df = new DiskFileItemFactory(); //將目錄綁定ServletFileUpload 類 這個類完成http協議的解析 ServletFileUpload upload=new ServletFileUpload(df); try { //解析req 返回所有表單項目目錄 List<FileItem> list = upload.parseRequest(req); for(FileItem item:list){ if(item.isFormField()){//正常表單項 String name=item.getFieldName(); String value=item.getString(); System.out.println(name+"======"+value); }else{//文件上傳項 String name=item.getName(); InputStream is = item.getInputStream(); OutputStream os = new FileOutputStream(new File(path,name)); byte[] buffer = new byte[400]; int len=0; while((len=is.read(buffer))!=-1) os.write(buffer, 0, len); os.close(); is.close(); } } } catch (FileUploadException e) { e.printStackTrace(); } } }
3. Struts2中已經將文件上傳功能封裝好了,不需要再像servlet一樣,分別來自己編碼實現。
實現步驟:
a) 編寫 jsp 頁面和 servlet 編寫方式一樣
<form action="upload.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/><input type="submit" value="上傳"/>
</form>
b) 編寫處理上傳文件的 Action
public class UploadAction { //File的名稱和表單域中的名稱相同 private File file; //獲取文件名 文件名屬性 必須是 表單域名+FileName; private String fileFileName; //獲取文件的類型 private String fileContentType; //上傳的處理方法 public String upload(){ String path=ServletActionContext.getServletContext().getRealPath("/upload"); try { FileUtils.copyFile(file, new File(path,fileFileName)); } catch (IOException e) { e.printStackTrace(); } return Action.SUCCESS; } 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; } }
4.批量的文件上傳實現
Action 的實現
public class BatchUploadAction { //File的名稱和表單域中的名稱相同 private File[] file; //獲取文件名 文件名屬性 必須是 表單域名+FileName; private String[] fileFileName; //獲取文件的類型 private String[] fileContentType; //上傳的處理方法 public String upload(){ String path=ServletActionContext.getServletContext().getRealPath("/upload"); try { for(int i=0;i<file.length;i++) FileUtils.copyFile(file[i], new File(path,fileFileName[i])); } catch (IOException e) { e.printStackTrace(); } return Action.SUCCESS; } 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; } }
Jsp
<script type="text/javascript" src="jquery-1.11.3.min.js"></script> <script type="text/javascript"> $(function(){ $('#btn').click(function(){ var html=$("#content").html(); html+="文件:<input type='file' name='file'/><br>"; $("#content").html(html); }); }); </script> </head> <body> <form action="batch.action" method="post" enctype="multipart/form-data"> 文件:<input type="file" name="file"/><input type="button" value="增加" id="btn"/><br> <div id="content"></div> <input type="submit" value="上傳"/> </form> </body>
Struts.xml
<struts> <!-- 設置上傳文件大小的常量 maximumSize是單個文件大小 maxSize 上傳總文件大小 maximunSize=20M maxSize=200M,說明一次可以上傳10個20M大小的文件 --> <constant name="struts.multipart.maxSize" value="209715200"></constant> <package name="default" extends="struts-default" namespace="/"> <action name="upload" class="cn.sxt.action.UploadAction" method="upload"> <result>/success.jsp</result> </action> <action name="batch" class="cn.sxt.action.BatchUploadAction" method="upload"> <result>/success.jsp</result> <interceptor-ref name="fileUpload"> <!-- 設置上傳的單個文件大小 --> <param name="maximumSize">20971520</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>