Commons-FileUpload组件

转载至:

       
>>Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理http文件上传的子项目。

Struts2多个文件上传
多个文件上传分为List集合和数组,下面我们着重介绍一下list集合的上传。都大同小异。
一 介绍
1.
在struts2文件上传的时候要先导入struts2的几个包,在struts2.3.1.2中,导入的包如图所视:

        >>Commons-FileUpload组件特点

从图上可以看出其中文件上传所需要的是包为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. 下面我们来写这样一个界面来实现多文件的上传:

               
>>使用简单:可以方便的嵌入到JSP文件中,编写少量代码即可完成文件的上传功能;

所用的html代码为:
<%@ page language=”java” import=”java.util.*”
pageEncoding=”utf-8″%>
<%@ taglib uri=”/struts-tags” prefix=”s”%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + “://”

                >>能够全程控制上传内容;

  • 澳门新葡亰游戏网址 ,request.getServerName() + “:” + request.getServerPort()
  • path + “/”;
    %>
    <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
    <html>
    <head>
    <base href=”<%=basePath%>”>
    <title>My JSP ‘tagUpload.jsp’ starting page</title>
    <meta http-equiv=”pragma” content=”no-cache”>
    <meta http-equiv=”cache-control” content=”no-cache”>
    <meta http-equiv=”expires” content=”0″>
    <meta http-equiv=”keywords”
    content=”keyword1,keyword2,keyword3″>
    <meta http-equiv=”description” content=”This is my page”>
    <!–
    <link rel=”stylesheet” type=”text/css” href=”styles.css”>
    –>

                >>能够对上传文件的大小、类型进行控制;

</head>

环境要求

<body>
<h3>
多个文件上传实例
</h3>
<s:form action=”/csdn/uploadList.action”
enctype=”multipart/form-data”
method=”post”>
<s:textfield label=”上传名称” name=”name”></s:textfield>
<s:file label=”上传文件” name=”upload”></s:file>
<s:file label=”上传文件” name=”upload”></s:file>
<s:file label=”上传文件” name=”upload”></s:file>
<s:submit value=”上传” />
</s:form>
</body>
</html>

        >>commons-fileupload-xxx.jar

在这里要注意的是要引入标签:
<%@ taglib uri=”/struts-tags” prefix=”s”%>

        >>commons-io-xxx.jar

上面的页面只是一个普通的html页面,没有任何的动态部分,当该页面提交请求的时候发送到/csdn/uploadList.action,这是一个struts2的action。
Struts2的Action无需负责处理HttpServletRequest请求,因为struts2的Action已经与servletAPI彻底分离了,struts2框架负责解析httpServletRequest请求的参数,包括文件域,strtus2使用File类型来封装文件域。
3.下面是处理Action的代码:

获取方式

package cn.csdn.hr.up.action;

        >>
下载Commons-FileUpload组件

import java.io.File;
import java.io.IOException;
import java.util.List;

        >>    下载Commons-IO组件

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

-—————————————————————————————————————————————————

import com.opensymphony.xwork2.ActionSupport;

实现步骤

public class TagUploadListAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;

        >>设置表单提交属性

// 上传多个文件的集合文本
private List<File> upload;

                <s:form enctype=”multipart/form-data”
method=”post”>

// /多个上传文件的类型集合
private List<String> uploadContextType;

                        <s:file name=”upload”
value=”上传”></s:file>

// 多个上传文件的文件名集合
private List<String> uploadFileName;

                </s:form>

public String getName() {
return name;
}

        >>编写文件上传处理Action

public void setName(String name) {
this.name = name;
}

                   Action中有3个必须的属性

public List<File> getUpload() {
return upload;
}

                private  File 
upload;    //对应表单的name,是临时文件,tmp文件

public void setUpload(List<File> upload) {
this.upload = upload;
}

                private String uploadContentType;   
//前面要和表单的name一致,后面的ContentType固定。

public List<String> getUploadContextType() {
return uploadContextType;
}

                private String uploadFileName;        //前面要和表单的name一致,后面的FileName固定。

public void setUploadContextType(List<String> uploadContextType)
{
this.uploadContextType = uploadContextType;
}

                public String
execute() throws IOException{

public List<String> getUploadFileName() {
return uploadFileName;
}

                        File destFile
= new File(ServletActionContext.getRequest().getRealPath(

public void setUploadFileName(List<String> uploadFileName) {
this.uploadFileName = uploadFileName;
}

                     
 “/upload”+”/”+this.getUploadFileName() ));

public String execute() {

                       
FileUtils.copyFile(upload,destFile);

// 把上传的文件放到指定的路径下
String path = ServletActionContext.getServletContext().getRealPath(
“/WEB-INF/uploadList”);

网站地图xml地图