`
aaa1aaaaa
  • 浏览: 10088 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

struct2 文件上传

 
阅读更多

多个文件上传分为List集合和数组,下面我们着重介绍一下list集合的上传。都大同小异。

一 介绍

1. 在struts2文件上传的时候要先导入struts2的几个包,在struts2.3.1.2中,导入的包如图所视:

从图上可以看出其中文件上传所需要的是包为commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar包。

2. Struts2文件上传并未提供自己的请求解析器,也就是说,struts2不会自己去处理multipart/form-data的请求,它需要调用其他的请求解析器,将http请求中的表单域解析出来。但struts2在原有的上传解析器继承上做了进一步封装,更进一步简化了文件上传。

3. Struts2默认使用的是Jakarta和Connon-FileUpload的文件上传框架,因此,如果需要使用struts2的文件上传功能,则需要在Web应用导入上面我所说的几个包

4. Struts2的文件上传支持在原有的问上传项目上做了进一步封装,简化了文件上传代码实现,取消了不同上传项目上编程差异。

二 实例

1. 首先我们来了解一下表单属性enctype属性的意义

表单的enctype属性指定的是表单数据的编码方式,该属性呢有3个值

(1)application/x-www-form-urlencoded,这是默认的编码方式,它只能处理表单域里的value属性,采用这种编码方式的表单会将表单域的值处理成URL编码方式。

(2)multipart/form-data,采用这种编码方式会以二进制流的方式来处理表单数据 ,这种编码方式会把文件域指定文件的内容也封装到请求参数里。

(3)text/plain,这种编码方式当表单的action属性为mailto:URL的形式是比较方便,这种方式主要适用于直接通过表单发送邮件的方式。

从以上的介绍可以看出为什么文件上传要用到的是multipart/form-data属性了吧!上传的文件会在底层封装,并通过二进制流读取。

2. 下面我们来写这样一个界面来实现多文件的上传:效果如下图:

所用的html代码为:

  1. <%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>
  2. <%@tagliburi="/struts-tags"prefix="s"%>
  3. <%
  4. Stringpath=request.getContextPath();
  5. StringbasePath=request.getScheme()+"://"
  6. +request.getServerName()+":"+request.getServerPort()
  7. +path+"/";
  8. %>
  9. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  10. <html>
  11. <head>
  12. <basehref="<%=basePath%>">
  13. <title>MyJSP'tagUpload.jsp'startingpage</title>
  14. <metahttp-equiv="pragma"content="no-cache">
  15. <metahttp-equiv="cache-control"content="no-cache">
  16. <metahttp-equiv="expires"content="0">
  17. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  18. <metahttp-equiv="description"content="Thisismypage">
  19. <!--
  20. <linkrel="stylesheet"type="text/css"href="styles.css">
  21. -->
  22. </head>
  23. <body>
  24. <h3>多个文件上传实例</h3>
  25. <s:formaction="/csdn/uploadList.action"enctype="multipart/form-data"method="post">
  26. <s:textfieldlabel="上传名称"name="name"></s:textfield>
  27. <s:filelabel="上传文件"name="upload"></s:file>
  28. <s:filelabel="上传文件"name="upload"></s:file>
  29. <s:filelabel="上传文件"name="upload"></s:file>
  30. <s:submitvalue="上传"/>
  31. </s:form>
  32. </body>
  33. </html>

在这里要注意的是要引入标签:

  1. <%@tagliburi="/struts-tags"prefix="s"%>

上面的页面只是一个普通的html页面,没有任何的动态部分,当该页面提交请求的时候发送到/csdn/uploadList.action,这是一个struts2的action。

Struts2的Action无需负责处理HttpServletRequest请求,因为struts2的Action已经与servletAPI彻底分离了,struts2框架负责解析httpServletRequest请求的参数,包括文件域,strtus2使用File类型来封装文件域。

3.下面是处理Action的代码:

  1. packagecn.csdn.hr.up.action;
  2. importjava.io.File;
  3. importjava.io.IOException;
  4. importjava.util.List;
  5. importorg.apache.commons.io.FileUtils;
  6. importorg.apache.struts2.ServletActionContext;
  7. importcom.opensymphony.xwork2.ActionSupport;
  8. publicclassTagUploadListActionextendsActionSupport{
  9. privatestaticfinallongserialVersionUID=1L;
  10. privateStringname;
  11. //上传多个文件的集合文本
  12. privateList<File>upload;
  13. ///多个上传文件的类型集合
  14. privateList<String>uploadContextType;
  15. //多个上传文件的文件名集合
  16. privateList<String>uploadFileName;
  17. publicStringgetName(){
  18. returnname;
  19. }
  20. publicvoidsetName(Stringname){
  21. this.name=name;
  22. }
  23. publicList<File>getUpload(){
  24. returnupload;
  25. }
  26. publicvoidsetUpload(List<File>upload){
  27. this.upload=upload;
  28. }
  29. publicList<String>getUploadContextType(){
  30. returnuploadContextType;
  31. }
  32. publicvoidsetUploadContextType(List<String>uploadContextType){
  33. this.uploadContextType=uploadContextType;
  34. }
  35. publicList<String>getUploadFileName(){
  36. returnuploadFileName;
  37. }
  38. publicvoidsetUploadFileName(List<String>uploadFileName){
  39. this.uploadFileName=uploadFileName;
  40. }
  41. publicStringexecute(){
  42. //把上传的文件放到指定的路径下
  43. Stringpath=ServletActionContext.getServletContext().getRealPath(
  44. "/WEB-INF/uploadList");
  45. //写到指定的路径中
  46. Filefile=newFile(path);
  47. //如果指定的路径没有就创建
  48. if(!file.exists()){
  49. file.mkdirs();
  50. }
  51. //把得到的文件的集合通过循环的方式读取并放在指定的路径下
  52. for(inti=0;i<upload.size();i++){
  53. try{
  54. //list集合通过get(i)的方式来获取索引
  55. FileUtils.copyFile(upload.get(i),newFile(file,uploadFileName.get(i)));
  56. }catch(IOExceptione){
  57. //TODOAuto-generatedcatchblock
  58. e.printStackTrace();
  59. }
  60. }
  61. returnSUCCESS;
  62. }
  63. }

通过以上的Action我们可以看出Action还包括了两个属性,uploadFileName,uploadContextType, 这两个属性分别用来封装上传我文件的文件名,上传文件的文件类型,这两个属性体现了struts设计的灵巧、简化之处,Action类直接通过File类型属性直接封装了上传文件的内容,但这个File属性无法获取上传文件的文件名和文件类型,所以struts2直接将包含的上传文件名和文件类型的信息封装到uploadFileName,uploadContextType属性中,可以认为:如果表单中包含一个name属性为xxx的文件域,则对应的Action需要使用3个属性来封装该文件域的信息:

(1) 类型为File的xxx属性封装了该文件域对应的文件内容

(2) 类型为String的xxxFileName属性封装了该案文件域对应的文件的文件类型

(3) 类型为String的xxxContextType属性封装了该文件域对应的文件的类型

通过上吗的三个属性可以简单的实现上传文件的文件名、文件类型和文件内容

3. 配置action的strtus.xml

  1. <?xmlversion="1.0"encoding="GBK"?>
  2. <!DOCTYPEstrutsPUBLIC
  3. "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <packagename="file"extends="struts-default"namespace="/csdn">
  7. <actionname="uploadList"class="cn.csdn.hr.up.action.TagUploadListAction">
  8. <result>../success.jsp</result>
  9. <resultname="input">../tagUpload.jsp</result>
  10. </action>
  11. </package>
  12. </struts>

4. 设置上传的文件的大小和类型

就是在struts.xml中用拦截器来设置

  1. <actionname="uploadList"class="cn.csdn.hr.up.action.TagUploadListAction">
  2. <result>../success.jsp</result>
  3. <resultname="input">../tagUpload.jsp</result>
  4. <!--通过拦截器来限制上传图片的类型和大小-->
  5. <interceptor-refname="fileUpload">
  6. <paramname="allowedTypes">image/bmp,image/x-png,image/gif</param>
  7. <paramname="maximumSize">200</param>
  8. </interceptor-ref>
  9. <interceptor-refname="defaultStack"></interceptor-ref>
  10. </action>

显示的错误提示信息的标签为:

<s:fielderror></s:fielderror>

以上的多个文件上传是List集合的,数组的也不过如此,要改变的地方为Action接收的时候类型的不同和读取的时候循环不同,下面的数组的例子为:

  1. //得到上传文件的名称一定与name值一直
  2. privateFileupload[];
  3. //上传文件的类型ContentType
  4. privateStringuploadContentType[];
  5. //上传文件的名称
  6. privateStringuploadFileName[];
  7. publicFile[]getUpload(){
  8. returnupload;
  9. }
  10. publicvoidsetUpload(File[]upload){
  11. this.upload=upload;
  12. }
  13. publicString[]getUploadContentType(){
  14. returnuploadContentType;
  15. }
  16. publicvoidsetUploadContentType(String[]uploadContentType){
  17. this.uploadContentType=uploadContentType;
  18. }
  19. publicString[]getUploadFileName(){
  20. returnuploadFileName;
  21. }
  22. publicvoidsetUploadFileName(String[]uploadFileName){
  23. this.uploadFileName=uploadFileName;
  24. }
  25. publicstaticlonggetSerialversionuid(){
  26. returnserialVersionUID;
  27. }
  28. publicStringuploads(){
  29. Stringpath=ServletActionContext.getServletContext().getRealPath(
  30. "/upload");
  31. //写到指定路径
  32. Filefile=newFile(path);
  33. //判断指定的路径下是否有uplaod,如果没有,自动创建
  34. if(!file.exists()){
  35. file.mkdirs();
  36. }
  37. try{
  38. for(inti=0;i<upload.length;i++){
  39. FileUtils.copyFile(upload[i],newFile(file,uploadFileName[i]));
  40. }
  41. }catch(IOExceptione){
  42. //TODOAuto-generatedcatchblock
  43. e.printStackTrace();
  44. }
  45. returnSUCCESS;
  46. }
分享到:
评论

相关推荐

    struts2文件上传下载源代码

    在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...

    struts2 文件上传

    Struts2 文件上传是Web开发中的一个重要功能,它允许用户通过网页上传文件到服务器。Struts2 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,提供了丰富的特性和强大的控制层功能,使得文件上传...

    struts2文件上传jar

    这个压缩包包含了实现Struts2文件上传所需的全部jar包,这些库文件对于理解和实现文件上传功能至关重要。 首先,我们要了解Struts2文件上传的基本流程。当用户通过表单提交包含文件输入字段的请求时,Struts2框架会...

    简单易懂的struts2文件上传

    在Struts2中,文件上传功能是一个常见的需求,例如用户可能需要上传图片、文档或其他类型的文件。本教程将深入浅出地讲解如何在Struts2中实现文件上传,并提供一个简单的实例来帮助理解。 1. **Struts2文件上传概述...

    struts2文件上传

    Struts2 文件上传是Web开发中的一个重要功能,它允许用户从他们的本地计算机向服务器传输文件。在Struts2框架中,文件上传是通过特定的拦截器实现的,这些拦截器处理了文件上传请求并提供了安全性和大小限制。下面将...

    Struts2文件上传

    Struts2文件上传是Web开发中常见的功能,用于允许用户在网页上选择并上传本地文件到服务器。在Java Web环境中,Struts2框架提供了一套完整的解决方案来处理文件上传请求。下面将详细介绍Struts2文件上传的核心概念、...

    struts 2文件上传

    在Struts 2中,文件上传功能是通过使用Struts 2的插件机制来实现的,这使得开发者能够方便地处理用户上传的文件。下面将详细讨论Struts 2文件上传的相关知识点。 ### 1. Struts 2文件上传原理 文件上传是基于HTTP...

    Struts2文件上传带进度条页面无刷新

    "Struts2文件上传带进度条页面无刷新"的实现涉及多个技术点,包括Struts2的文件上传插件、AJAX异步通信以及前端进度条展示。 首先,Struts2的文件上传依赖于`struts2-upload-plugin`。这个插件扩展了Struts2的核心...

    Struts2之struts2文件上传详解案例struts011

    在这个"Struts2之struts2文件上传详解案例struts011"中,我们将深入探讨如何实现这一功能。 首先,我们需要了解Struts2中的Action类,它是处理用户请求的核心组件。为了支持文件上传,我们需要创建一个继承自`org....

Global site tag (gtag.js) - Google Analytics