java之struts2之文件上传
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>