struts2文件上传的采用的三种方式解析和上传下载讲解

来源:互联网 发布:js urlencode 怎么使用 编辑:程序博客网 时间:2024/04/28 17:04

1.三种方式解析

文件上传几乎是每个项目实现的一个必须的模块。
上传就是将信息从个人计算机(本地计算机)传递到中央计算机(远程计算机)系统上,让网络上的人都能看到。将制作好的网页、文字、图片等发布到互联网上去,以便让其他人浏览、欣赏。这一过程称为上传。
JAVA实现文件上传的几个组件:
1 SmartUpload 用的最多的一个组件,已经不再更新了,可以实现上传和下载
2 FileUpload Apache实现的文件上传组件,功能齐备
3 J2KUpload java2000实现的文件上传组件,全部使用内存,适合多个不超过10M的小文件


下面具体说说FileUpload Apache实现的文件上传组件。
1、/** 按copy方式上传 */
Java代码

[java] view plaincopyprint?
  1. public String uploadFile(){       
  2.     /**保存的具体路径*/      
  3.     String savepath = getSavePath();       
  4.     /**根据保存的路径创建file对象*/      
  5.     File file = new File(savepath);       
  6.     if(!file.exists()){       
  7.         /**创建此文件对象路径*/      
  8.         file.mkdirs();       
  9.     }       
  10.     try {       
  11.         /**使用的是:org.apache.commons.io.FileUtils FileUtils*/      
  12.         FileUtils.copyFile(pic, new File(file,getPicFileName()));       
  13.     } catch (IOException e) {       
  14.         e.printStackTrace();       
  15.     }       
  16.     return SUCCESS;       
  17. }    
备注:
1、getSavePath()方法中,ServletActionContext().getServletContext().getRealPath
(savePath+"\\"+getPicFileName()); ,这个主要是一个文件的实际路径
2、我个人认为这种方式是简单易用的。按copy方式上传使用的是Apache公司的
org.apache.commons.io.FileUtils包里的FileUtils.java。
2、/** 按字节方式上传 */
Java代码
[java] view plaincopyprint?
  1. public String uploadFile(){            
  2.     /** 文件的写操作 */        
  3.     FileInputStream fis = null;        
  4.     FileOutputStream fos = null;       
  5.         /** 保存的路径 */      
  6.     String savepath = getSavePath();       
  7.     /** 根据保存的路径创建file对象 */      
  8.     File file = new File(savepath);       
  9.     /** file对象是否存在   */      
  10.     if (!file.exists()) {       
  11.         /** 创建此文件对象路径  */      
  12.         file.mkdirs();       
  13.     }       
  14.     try {       
  15.         /** 创建输入流 */      
  16.         fis = new FileInputStream(pic);       
  17.         /** 输出流 更据文件的路径+文件名称创建文件对象 */      
  18.         fos = new FileOutputStream(file + "//" + getPicFileName());       
  19.         /** 读取字节   */      
  20.         byte b[] = new byte[1024];       
  21.         int n = 0;       
  22.         /** 读取操作   */      
  23.         while ((n = fis.read(b)) != -1) {       
  24.             /** 写操作   */      
  25.             fos.write(b, 0, n);       
  26.         }       
  27.         /** 关闭操作  */      
  28.         if (fis != null) {       
  29.             fis.close();       
  30.         }       
  31.         if (fos != null) {       
  32.             fos.close();       
  33.         }       
  34.     } catch (Exception e) {       
  35.         e.printStackTrace();       
  36.     }       
  37.     return SUCCESS;       
  38. }     
3、/** 按字符方式上传 即“三层管道” */
Java代码
[java] view plaincopyprint?
  1. public String uploadFile(){       
  2.     /** 文件的写操作 */      
  3.     BufferedReader br =null;       
  4.     BufferedWriter bw = null;          
  5.     /** 保存的路径 */      
  6.     String savepath = getSavePath();       
  7.     /** 根据保存的路径创建file对象   */      
  8.     File file = new File(savepath);       
  9.     /** file对象是否存在  */      
  10.     if (!file.exists()) {                  
  11.         /** 创建此文件对象路径  */      
  12.         file.mkdirs();       
  13.     }       
  14.     try {       
  15.         /**   创建一个BufferedReader  对象*/      
  16.         br = new BufferedReader(new InputStreamReader(new FileInputStream       
  17.       
  18. (pic)));                   
  19.         bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream       
  20.       
  21. (file + "//" + getPicFileName())));       
  22.                    
  23.         // 读取字节        
  24.         char b[] = new char[1024];       
  25.         int n = 0;       
  26.         // 读取操作        
  27.         while ((n = br.read(b)) != -1) {       
  28.             // 写操作        
  29.             bw.write(b, 0, n);       
  30.         }       
  31.         // 关闭操作        
  32.         if (br != null) {       
  33.             br.close();       
  34.         }       
  35.         if (bw != null) {       
  36.             bw.close();       
  37.         }       
  38.     } catch (Exception e) {       
  39.         e.printStackTrace();       
  40.     }       
  41.     return SUCCESS;       
  42. }     


备注:
第二种上传方式没有第三种上传方式效率高。
建议:
最好用第一种方式上传,次之使用第三种方式上传,最后再使用第二种方式上传。

 

2.上传下载讲解

 

一、Struts2文件上传

 

Struts2的文件上传实现非常简单,只需要简单几步就可完成;

注意:

(1)文件上传的struts2标签为:<s:file name="" label="上传"/>

(2)文件上传的前提是表单属性method="post" enctype="multipart/form-data";

(3)web应用中必须包含common-fileupload.jar和common-io.jar,因为struts2默认上传解析器使用的是jakarta;

(4)可以在struts.xml中配置最大允许上传的文件大小:<constant name="struts.multipart.maxSize" value="....."/>,默认为2M;

 

1.普通文件上传

 

实现规则:

(1)在JSP中设定表单控件<s:file name="upload" label="上传"/>

(2)在Action中定义属性:

private File upload;        //包含文件内容

private String uploadFileName;    //上传文件的名称;

private String uploadContentType;    //上传文件的MIME类型;

这些属性都会随着文件的上传自动赋值;

(3)在execute()中完成写入磁盘功能;

 

代码示例:

 

Upload01Action.java

 

 

[java] view plaincopy
  1. package org.upload.action;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6.   
  7. import org.apache.struts2.ServletActionContext;  
  8.   
  9. import com.opensymphony.xwork2.ActionSupport;  
  10.   
  11. public class Upload01Action extends ActionSupport {  
  12.     private File upload;  
  13.     private String uploadFileName;  
  14.     private String uploadContentType;  
  15.     private String name;  
  16.     public String execute()throws Exception{  
  17.         String path = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");  
  18.         String filename = path+File.separator+name;  
  19.         FileInputStream in = new FileInputStream(upload);  
  20.         FileOutputStream out = new FileOutputStream(filename);  
  21.         byte[]b = new byte[1024];  
  22.         int len = 0;  
  23.         while((len=in.read(b))>0){  
  24.             out.write(b,0,len);  
  25.         }  
  26.         out.close();  
  27.         return SUCCESS;  
  28.     }  
  29.   
  30.     public File getUpload() {  
  31.         return upload;  
  32.     }  
  33.   
  34.     public void setUpload(File upload) {  
  35.         this.upload = upload;  
  36.     }  
  37.   
  38.     public String getUploadFileName() {  
  39.         return uploadFileName;  
  40.     }  
  41.   
  42.     public void setUploadFileName(String uploadFileName) {  
  43.         this.uploadFileName = uploadFileName;  
  44.     }  
  45.   
  46.     public String getUploadContentType() {  
  47.         return uploadContentType;  
  48.     }  
  49.   
  50.     public void setUploadContentType(String uploadContentType) {  
  51.         this.uploadContentType = uploadContentType;  
  52.     }  
  53.   
  54.     public String getName() {  
  55.         return name;  
  56.     }  
  57.   
  58.     public void setName(String name) {  
  59.         this.name = name;  
  60.     }  
  61.       
  62.       
  63. }  

 

 

struts.xml

 

 

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <constant name="struts.devMode" value="true" />  
  8.     <constant name="struts.custom.i18n.resources" value="message"></constant>  
  9.     <package name="default" namespace="/"  extends="struts-default">  
  10.         <action name="upload0*" class="org.upload.action.Upload0{1}Action">  
  11.             <param name="name">1.jpg</param>  
  12.             <result>/{1}.jsp</result>  
  13.         </action>  
  14.     </package>  
  15. </struts>  

 


1.jsp

 

 

[html] view plaincopy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@taglib prefix="s" uri="/struts-tags" %>  
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>      
  6.     <title>My JSP '1.jsp' starting page</title>  
  7.   </head>  
  8.     
  9.   <body>   
  10.     <s:form action="upload01" method="post" enctype="multipart/form-data">  
  11.         <s:file name="upload" label="上传"></s:file>  
  12.         <s:submit value="上传"></s:submit>  
  13.     </s:form>  
  14.   </body>  
  15. </html>  

 


 

2.利用拦截器进行过滤

 

手动实现过滤的方式非常简单,就是利用输入校验的方式进行过滤,即在validate()中进行过滤;

而这里要讲的拦截器方式是很好的方式,只需要在配置文件中配置,灵活性很好,能够限制文件的类型、文件的大小;如果上传的文件不符合要求,则返回input逻辑视图;

 

配置拦截器步骤:

 

(1)文件上传的拦截器为fileUpload;

(2)需要给定参数allowedTypes、maximumSize;

(3)在fileUpload拦截器后,需要添加<interceptor-ref name="defaultStack"/>

 

代码示例:

 

由于通过拦截器进行过滤只需要配置struts.xml,因此这里只给出struts.xml的配置

 

 

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <constant name="struts.devMode" value="true" />  
  8.     <constant name="struts.custom.i18n.resources" value="message"></constant>  
  9.     <package name="default" namespace="/"  extends="struts-default">  
  10.         <action name="upload0*" class="org.upload.action.Upload0{1}Action">  
  11.             <interceptor-ref name="fileUpload">  
  12.                 <param name="allowedTypes">image/jpeg,image/gif</param>  
  13.                 <param name="maximumSize">1024*1024</param>  
  14.             </interceptor-ref>  
  15.             <interceptor-ref name="defaultStack"></interceptor-ref>  
  16.             <param name="name">1.jpg</param>  
  17.             <result>/{1}.jsp</result>  
  18.             <result name="input">/{1}.jsp</result>  
  19.         </action>  
  20.     </package>  
  21. </struts>  

 


 

我们还需要配置文件上传失败后的错误提示信息,我们需要在全局国际化资源文件中配置:

 

 

[html] view plaincopy
  1. struts.messages.error.content.type.not.allowed=文件类型不匹配  
  2.   
  3. struts.messages.error.file.too.large=文件太大  

 


 

 

二、Struts2文件下载

 

我们在学习Servlet和HTTP协议时已经可以实现文件下载,即写content-disposition头即可,struts2的实现原理也是这个,但是提供了更好的封装性;

struts2的stream结果类型专门用于实现文件下载;

(1)struts.xml中配置stream结果类型,并配置contentType、contentDisposition、bufferSize参数即可,模板:

 

[html] view plaincopy
  1. <action name="download" class="">  
  2.     <result type="stream" name="success">  
  3.         <param name="contentType"></param>  
  4.         <param name="contentDisposition">attachment;filename=""</param>  
  5.         <param name="bufferSize">4096</param>  
  6.     </result>  
  7. </action>  

 


(2)在Action中创建public InputStream getInputStream()throws Exception;方法,此方法用于获得下载文件的输入流;

 

DownloadAction.java

 

 

[java] view plaincopy
  1. package org.download.action;  
  2.   
  3. import java.io.InputStream;  
  4.   
  5. import org.apache.struts2.ServletActionContext;  
  6.   
  7. import com.opensymphony.xwork2.ActionSupport;  
  8.   
  9. public class DownloadAction extends ActionSupport {  
  10.     public InputStream getInputStream()throws Exception{  
  11.           
  12.         return ServletActionContext.getServletContext().getResourceAsStream("/WEB-INF/upload/1.jpg");  
  13.           
  14.     }  
  15.     public String execute()throws Exception{  
  16.         return SUCCESS;  
  17.     }  
  18. }  

 


struts.xml

 

 

[html] view plaincopy
  1. <action name="download" class="org.download.action.DownloadAction">  
  2.             <result type="stream" name="success">  
  3.                 <param name="contentType">image/jpeg</param>  
  4.                 <param name="contentDisposition">attachment;filename="1.jpg"</param>  
  5.                 <param name="bufferSize">4096</param>  
  6.             </result>  
  7.         </action>  

 


 

就可以完成下载;

 

 


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 顺产后子宫脱垂怎么办 顺产完子宫脱垂怎么办 额头长了个鱼鳞怎么办 脸上长了很多痣怎么办 做过狐臭的疤痕怎么办 痤疮留下的红印怎么办 脸上疤掉了黑印怎么办 脸上有黑色的疤怎么办 一只眼睛外斜视怎么办 残币银行不给换怎么办 手上有多套房的怎么办 长了两层脚指甲怎么办 指甲长了两层怎么办 脚趾甲长了两层怎么办 产妇气血虚没奶怎么办 哺乳期气血不足奶水少怎么办 刚怀孕喝了啤酒怎么办 受风怎么办最快最有效 孕妇后背受风了怎么办 肩膀和后背受风怎么办 手指关节杵肿了怎么办 骨关节退行性变怎么办 疼风脚趾肿了怎么办 痛风脚右侧肿了怎么办 痛风引起的脚肿怎么办 老人腰闪了该怎么办 腰闪了站不起来怎么办 又怕冷又爱上火怎么办 肝上多发小囊肿怎么办 5岁宝宝咳嗽厉害怎么办 5岁宝宝咳嗽有痰怎么办 生川乌外贴中毒怎么办 7个月宝宝流鼻涕怎么办 脸上皮肤毛孔粗大有黑头怎么办 嗓子长了个囊肿怎么办 食管胃粘膜异位怎么办 狗狗肿瘤破了怎么办 婴儿胃食道反流怎么办 小儿胃食道反流怎么办 放疗后咳嗽痰多怎么办 胃息肉是恶性的怎么办