java 文件上传

文件上传


无论用什么组件上传文件,必须将form的enctype属性设置为multipart/form-data
无论是struts1还是struts2,在上传文件时,不能用get方式提交表单,负责会报错:status 404 No result defined for action xxx and result input


struts1文件上传
    struts1文件上传,主要是用到了struts1提供的org.apache.struts.upload.FormFile组件,该组件会主动接受前台页面中type="file"的文件。但是需要注意的是前台页面中, type="file"的组件的name属性的值 必须和自己定义的form组件中,类型是org.apache.struts.upload.FormFile的字段的名称一致,负责,struts1无法将页面中的属性封装成ActionForm。
    所以,开发struts1的文件上传功能,需要做的是:开发form组件,form组件需要继承自org.apache.struts.action.ActionForm。在自己form中定义private FormFile theFile;并且页面中type="file"的组件的名称必须是theFile,和form组件中一致。action中和普通action一样。
另外:struts1无法和struts2一样,接受file的类型及其它属性。例如:在form中,添加private String theFileType;private  String theFileName;提供get和set方法,是无法将属性注入到这些属性的。只会注入FormFile属性。theFileType和theFileName是空的。
    struts1为了保存文件方便,一般会在配置org.apache.struts.action.ActionServlet时,加上如下初始化参数:
         <init-param>
<param-name>uploadlocation</param-name>
<param-value>/upload/</param-value>
</init-param>
<init-param>
<param-name>downloadlocation</param-name>
<param-value>/download/</param-value>
</init-param>
     在action中,用servlet.getServletConfig().getInitParameter("uploadlocation")来取得配置的参数。servlet是org.apache.struts.action.Action提供的实例。


Struts2文件上传

     struts2没有提供自己的请求解析器,也就是说,struts2不会自己区处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来,但struts2在原有的上传解析器上作了进一步封装,更进一步简化了文件上传。Struts2的struts.properties配置文件中,配置struts2的上传文件解析器。 
     struts.multipart.parser=jakarta  (srtuts2默认),也可以设置为常用的cos,pell等。
struts.multipart.parser:该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos、pell和jakarta等属性值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta,即common-fileupload.jar.

     注意  如果需要使用cos或者pell的文件上传方式,则应该将对应的JAR文件复制到Web应用中。例如,使用cos上传方式,则需要自己下载cos框架的JAR文件,并将该文件放在WEB-INF/lib路径下。

    struts2文件上传,主要用的是默认的apach的commons-fileupload.jar组件,该jar包已经添加在struts2的lib中,所以,要实现struts2的文件上传功能,需要添加该jar包。该包和struts2本身是脱离的,所以,可以在非struts2的项目中单独使用。
    值得注意的是,和struts1不一样,commons-fileupload.jar组件在完成文件上传的时候,会首先将文件保存成临时文件,然后将临时文件做输入流。而struts1是没有中间临时文件的。
    Struts2中直接使用io的File组件接受页面的上传文件。
    commons-fileupload组件在封装页面上传的文件的时候,会将文件保存在临时目录,tomcat时,临时目录是F:\Tomcat\Tomcat6.0\work\Catalina\localhost\+项目名称。


     在action中定义如下属性
     //上传文件
private File upload;
上传文件类型,自动封装
private String uploadContentType;
//上传文件名称,自动封装
private String uploadFileName;
     commons-fileupload组件,在封装时,不仅可以吧前台页面的文件封装到File upload中,还可以将文件类型和文件名称封装到uploadContentType和uploadFileName中,值得注意的是uploadContentType和uploadFileName的名称需要遵循规则,负责无法封装。规则是定义的文件名称+ContentType和FileName。




异步上传


异步上传可以采用ajaxfileupload.js组件。action中任然用commons-fileupload.jar组件。
页面中可以用
$.ajaxFileUpload({
url:'${ctx}/common/upload.action',
secureuri : false,
fileElementId:'upfile',
dataType : 'json',
success:function(){
},
error:function(){
}
});


如果异步上传是用<input type="file" name="txtFile" id="upfile"/>,则需要同时使用id属性和name属性。其中,fileElementId指的是页面中type="file"的id属性,在后台中取到的是name属性。


在后台action中,需要用到MultiPartRequestWrapper,struts2举例代码:
          MultiPartRequestWrapper request = (MultiPartRequestWrapper) ServletActionContext.getRequest();
  Enumeration<String> fileInputIds = request.getFileParameterNames();
  // 获取了上传文件表单的id
  String fileInputId = fileInputIds.nextElement(); //这里取到的是fileElementId:'upfile'中定义的id='upfile'的属性的name值,这里是txtFile。
  String fileNames[] = request.getFileNames(fileInputId); // 上传的原文件名
  File files[] = request.getFiles(fileInputId); // 对应的系统临时文件
  File uploadfile = files[0];
  String filename = fileNames[0];





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值