Commons-fileupload文件上传

本文详细介绍如何使用Struts2框架结合Commons-FileUpload组件实现文件上传功能,包括单文件与多文件上传的实现过程,配置Struts.xml,以及上传Action类的编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 文件上传、下载

基于表单的文件上传。

Commons-fileupload

    1. Commons-FileUpload组件

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

 

Commons-FileUpload组件特点:

  1. 使用简单:可以方便地嵌入到JSP文件中,编写少量代码即可完成文件的上传功能
  2. 能够全程控制上传内容
  3. 能够对上传文件的大小、类型进行控制
    1. 引入依赖(导包)

http://jakarta.apache.org/commons/fileupload/

–下载commons-fileupload-1.2-bin.zip文件

–解压后得到commons-fileupload-1.2.jar

 

http://jakarta.apache.org/commons/io/

–下载commons-io-1.3.2-bin.zip文件

–解压后得到commons-io-1.3.2.jar

 

注意:如果使用Maven创建项目并引入struts核心依赖包的(Struts-core),已包含有FileUpload包。

    1. Web表单

文件上传页面upload.jsp:

<%@ taglib uri="/struts-tags" prefix="s"%>

<body>

    <!-- 传统写法 -->

    <form action="uploads" method="post" enctype="multipart/form-data">

        <!--注意:file控件的name与Action中的File要一致-->

文件:<input type="file" name="uploadImage">

        <input type="submit" value="提交">

</form>

 

    <!-- Struts标签库写法 -->

    <s:form action="uploads" method="post" enctype="multipart/form-data">

        <s:file name="uploadImage" label="选择上传的文件" />

        <s:submit value="上传" />

    </s:form>

</body>

 

注意:上面是基于表单的上传,在form标签中有两个重点属性

  1. method表单提交方式必须为“post”;
  2. 必须为表单添加enctype值,并置为:multipart/form-data
    1. 上传Action类UploadAction(简单的保存文件方式)

package com.struts;

import java.io.File;

import java.io.IOException;

import org.apache.commons.io.FileUtils;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

 

public class UploadAction extends ActionSupport {

    //得到上传的文件(要与form表单中file控件名一致)

private File uploadImage;

//得到文件的类型

private String uploadImageContentType;

//得到文件的名称

private String uploadImageFileName;

// 此处省略set和get方法

  

public String execute(){

    //文件名使用时间戳+扩展名

    this.setUploadImageFileName(System.currentTimeMillis() + this.getUploadImageFileName().substring(this.getUploadImageFileName().lastIndexOf(".")));

 

        System.out.println("文件名:" + this.getUploadImageFileName());

        System.out.println("文件类型:" + this.getUploadImageContentType());

        System.out.println("文件对象:" + this.getUploadImage());

 

        //获取要保存文件夹的物理路径(绝对路径)

        String realPath = ServletActionContext.getServletContext().getRealPath("/upload");

        //http://localhost:8080/T214_struts1/upload/a.jpg

        File file = new File(realPath);

        //测试此抽象路径名表示的文件或目录是否存在。若不存在,创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

        if(!file.exists()){

file.mkdirs();

        }

        try {

            //保存文件

            FileUtils.copyFile(uploadImage, new File(file, uploadImageFileName));

        } catch (IOException e) {

            e.printStackTrace();

        }

        return SUCCESS;

    }

}

 

    1. 配置Struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>

<!-- 要注意Struts2默认文件上传最大为2M即便你设置了

<param name="maximumSize">5242880</param>

当上传的文件大于2M时候也会出错的这时要设置,另外一个常量

        <constant name="struts.multipart.maxSize" value="1000000000"/>

-->

    

    <package name="Struts2" extends="struts-default" namespace="/">

        <action name="uploads" class="com.struts.UploadAction">

<!-- 指定(限制)上传文件的类型,定义局部拦截器,修改默认拦截器的属性

                "fileUpload.maximumSize" :限制上传最大的文件大小。

                "fileUpload.allowedTypes":允许上传文件的类型。

                "fileUpload.allowedExtensions":允许上传文件的可扩展文件类型。

-->

 

<!--配置fileUpload的拦截器 -->

<interceptor-ref name="fileUpload">

<!--配置允许上传的文件类型 -->

<param name="allowedTypes">application/vnd.ms-excel,image/bmp,image/png,image/gif,image/jpeg</param>

<!--配置允许上传的文件大小单位字节 -->

<param name="maximumSize">5242880</param>

<param name="fileUpload.allowedExtensions">.jpg,.txt,.ppt</param>

</interceptor-ref>

<interceptor-ref name="defaultStack" />

<result>/success.jsp</result>

 

            <!-- 出现错误自动会返回input结果,进入结果视图 -->

            <result name="input" >/error.jsp</result>

            

        </action>

    </package>

</struts>    

附加:contentType类型设置

    1. 前端

Success.jsp

<body>

    成功页面

</body>

 

Error.jsp

<!-- 引入struts2的标签库 -->

<% @ taglib uri="/struts-tags" prefix="s" %>

<body>

    跳转错误页面…<br>

<!-- fielderror标签输出action的fieldErrors属性保存的字段错误,fieldErrors是一个map类型的属性-->

    <s:fielderror />

    <!-- 生产一个查看debug信息的链接 -->

    <s:debug />

</body>

 

    1. 多文件上传
  1. 先修改form表单页,改成H5,去掉jsp页面中的

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

改为:<!DOCTYPE html>或全部删除。

 

同时为file控件添加:multiple属性,如:

<input type="file" name="uplaodFile" multiple="multiple" />

 

  1. 将Action中的三个属性全部改成数组,并封装,同时获取里面的文件名和类型等。如:

package com.zking.struts2;

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

import org.apache.commons.io.FileUtils;

import org.apache.struts2.ServletActionContext;

import lombok.Data;

@Data
public class Uploa1dAction2 {
      
    //得到上传的文件要与form表单中的file名要一致
    private File[] uploadImage;
    //得到文件的类型
    private String[] uploadImageContentType;
    //得到文件的名称
    private String[] uploadImageFileName;
    
    public String execute() {
        //文件名使用时间戳+拓展名
        
        for (int i = 0; i <getUploadImage().length; i++) {
            
            String a = UUID.randomUUID().toString();
            String b = a+this.getUploadImageFileName()[i];
            System.out.println("文件名:"+this.getUploadImageFileName()[i]);
            System.out.println("文件类型:"+this.getUploadImageContentType()[i]);
            System.out.println("文件对象:"+this.getUploadImage()[i]);
            
            
            //获取要保存文件夹的物理路径(绝对路径)
            String realPath=ServletActionContext.getServletContext().getRealPath("/upload");
            //http://localhost:8080/T214_struts1/upload/a.jpg
            File file=new File(realPath);
            if(!file.exists()) {
                file.mkdirs();
            }
            
            try {
                //保存文件
                FileUtils.copyFile(uploadImage[i],new File(file, b));
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        return "success";
    }
    
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值