struts2 实现简单的文件上传、下载功能
2017-11-05 17:34
639 查看
一、使用 commons-fileupload.jar 实现文件上传
1.1 commons-fileupload.jar 简介
Commons FileUpload 是 Apache Commons 下的一个子项目,commons-fileupload 包能够让你的 servlet 和 web 应用能够很方便的实现健壮的、高性能的文件上传功能。FileUpload 可以解析 HTTP 请求。如果一个 HTTP 请求使用 POST 方式提交,且该请求的内容类型标识为 “multipart/form-data” ,那么 FileUpload 就可以解析这个请求,并且使得到的结果更容易被程序所使用。
发送 “multipart/form-data” 请求的最简单的方法是通过页面表单提交请求。
<!-- 注:页面文件上传表单, method 属性必须为 "post",且编码类型 enctype 属性必须是 "multipart/form-data",任何语言都需要满足这两点。--> <form action="fileUpload.action" method="post" enctype="multipart/form-data"> file: <input type="file" name="file"> <br> username: <input type="text" name="username"><br> <input type="submit" value="sumit"> </form>
1.2 在 servlet 类中使用Commons-fileupload 实现简单的文件上传
public class UploadServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { DiskFileItemFactory factory = new DiskFileItemFactory(); String path = req.getRealPath("/fileUp"); //指定大文件的临时存放目录 factory.setRepository(new File(path)); //设置大文件的最小大小,默认为10K,设置单位为字节,现在设置的大小为1G factory.setSizeThreshold(1024*1024); ServletFileUpload upload = new ServletFileUpload(factory); try{ //list 集合里不但存放了上传的文件信息,还存放表单的其他类型请求的信息 List<FileItem> list = upload.parseRequest(req); for(FileItem item:list){ String name = item.getFieldName(); //判断是否为普通的表单内容 if(item.isFormField()){ String value = item.getString(); System.out.println(name+"="+value); req.setAttribute(name, value); }else{ //获取文件名,有些浏览器会包括路径,如opera浏览器 String value = item.getName(); //如果忽略opera浏览器则不需要删除路径的操作 int start = value.lastIndexOf("\\"); String fileName = value.substring(start+1); req.setAttribute(name, fileName); //item.write完成上传文件写入服务器指定目录的工作,且会自动删除临时文件 // item.write(new File(path,fileName)); //如果需要自己实现写入硬盘的操作,需要删除临时文件 OutputStream os = new FileOutputStream(new File(path,fileName)); InputStream is = item.getInputStream(); byte[] buffer = new byte[400]; int length = 0; while((length = is.read(buffer))!= -1){ os.write(buffer, 0,length); } is.close(); os.close(); } } }catch(Exception e){ e.printStackTrace(); } //将请求转发给fileUploadResult.jsp结果页面 req.getRequestDispatcher("/fileUp/fileUploadResult.jsp").forward(req, resp);; } }
二 使用 struts2 实现文件上传功能
struts2 没有自己的文件上传实现,它仅仅是封装了common-fileupload 等第三方的文件上传的工具。struts2 中在 default.properties 文件中设置了默认的最大上传文件大小为2M:
struts.multipart.maxSize=2097152(单位:byte,字节)
可在程序中创建struts.properties,或者在 struts.xml 中重新制定该属性的大小:
#在struts.properties中设置最大文件上传大小为1G struts.multipart.maxSize=1073741824 <!-- 在struts.xml中设置最大文件上传大小为1G --> <constant name="struts.multipart.maxSize" value="1073741824"></constant>
struts2 实现文件上传功能的示例:
public class UploadAction extends ActionSupport { private String username; //struts2会自动将上传的文件转换为File对象,使用file.getName()会获得临时文件的文件名 private File file; //获得上传文件的文件名,不能用file.getName获得。 //且其命名规则中file为上传文件的表单的name属性值,加"FileName"; private String fileFileName; //获得上传文件的类型 //命名规则:上传文件的表单的name属性值,加"FileName" private String fileContentType; //对于多文件上传可设置List类型属性或多个满足命名规则的不同属性: //private List<File> file; //private List<String> fileFileName; //private List<String> fileContentType; @Override public String execute() throws Exception { String root = ServletActionContext.getRequest().getRealPath("/fileUp"); System.out.println(root); InputStream is = new FileInputStream(file); System.out.println("fileFileName: "+fileFileName); File destFile = new File(root,fileFileName); OutputStream os = new FileOutputStream(destFile); byte[] buffer = new byte[400]; int length = 0; while(-1 != (length = is.read(buffer))){ os.write(buffer,0,length); } is.close(); os.close(); return SUCCESS; } 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; } }
三、struts2 实现下载功能
struts2 实现下载实例一:
// DownloadAction.java public class DownloadAction extends ActionSupport { // 用于动态生成下载的文件名 private String filename; public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } //主要的执行方法 public InputStream getDownloadFile(){ //如果输入的是中文名文件,不做处理在页面上显示会出现乱码的情况 //需要做如下处理:this.filename = new String("中文.txt".getBytes("gbk"),"8859_1");gbk为操作系统默认编码,8859_1是http协议要求编码 //参考资料:http://jiapumin.iteye.com/blog/1006144 this.filename = "haha.txt"; return ServletActionContext.getServletContext().getResourceAsStream("/download/xxx.txt"); } @Override public String execute() throws Exception { return SUCCESS; } } <!-- struts.xml --> <package name="struts2" extends="struts-default" namespace="/"> <action name="downloadFile" class="com.struts2.download.DownloadAction"> <!-- "contentDisposition" 属性为http协议的一个属性 "attachment;"不加的话默认为 inline ,当下载的文件,浏览器判定可以打开时会自动打开,不会跳出下载框 filename="xxx" 的值会决定浏览器下载时文件的文件名 filename=${filename} 动态生成下载文件显示的文件名 inputName的值会使程序执行action中的get+属性值的方法,示例中即为 getDownloadFile 方法。 --> <result type="stream"> <param name="contentDisposition">attachment;filename=${filename}</param> <param name="inputName">downloadFile</param> </result> </action> </package>
相关文章推荐
- Struts2实现文件的上传与动态下载功能。
- 简单使用Struts2 实现上传下载功能
- java中struts2实现文件上传下载功能
- struts2实现文件上传与下载功能
- Struts2-上传/下载文件功能实现
- 使用Struts2简单的基本文件上传下载实现
- 用MVC实现简单的文件(图片)上传下载功能
- java中struts2实现文件上传下载功能实例解析
- java中struts2实现简单的文件上传与下载
- JavaEE中struts2实现文件上传下载功能实例解析
- struts2实现简单文件下载功能
- JavaEE中struts2实现文件上传下载功能实例解析
- 用Struts2更好的实现文件的上传、下载功能以及解决中文名称问题
- JavaWeb中struts2实现文件上传下载功能实例解析
- 使用Struts2实现简单的文件上传和下载
- JavaWeb 文件的上传和下载功能简单实现代码
- 用Struts2实现文件上传时显示进度条功能
- 简单介绍用JSP来实现文件下载功能的几种方式
- 利用Apache的commons-net实现FTP的文件读取、上传、下载、删除和移动功能
- Struts2实现单文件的上传功能实例详解及源代码