Java使用Commons-FileUpload组件实现文件上传最佳方案

学习的目标

使用commons-fileupload实现文件上传

使用commons-fileupload封装文件上传工具类

什么是commons-fileupload?

The CommonsFileUploadpackage makes it easy to add robust, high-performance, file upload capability to your servlets and web applications.

FileUpload parses HTTP requests which conform toRFC 1867, "Form-based File Upload in HTML". That is, if an HTTP request is submitted using the POST method, and with a content type of "multipart/form-data", then FileUpload can parse that request, and make the results available in a manner easily used by the caller.

FileUpload包可以很容易地添加强大的,高性能,文件上传到你的Servlet的Web应用程序的能力。

FileUpload解析HTTP请求符合RFC 1867年,“在HTML的文件上传。就是说,如果一个HTTP请求是使用POST方法提交,并与一个内容类型“multipart/form-data”,然后FileUpload可以解析这个请求,并把结果提供一个容易使用的调用方式。

为什么要使用commons-fileupload

在使用传统的Servlet上传的时候我们可以使用req.getInputStream()来获取文件上传的流,我们在获取到这个流之后需要手动的针对这个流进行特殊处理进行去流中不必要的开始和结束内容,才能真正的获取到流的内容,本章节并不对原始Servlet的上传进行探究,我们另开章节针对原始Servelt上传进行探究。

使用commons-fileupload的要求

  1. method方法必须是POST,不能是GET
  2. 新加一个属性enctype,值为”multipart/form-data”
  3. 文件表单项<input>的类型为file,即type=”file”

使用commons-fileupload核心步骤解读

第一步:判断是否可以进行文件上传

第二步:创建一个FileItem工厂,通过工厂创建文件上传核心组件ServletFileUpload对象

第三步:通过核心上传组件解析request请求,获取表单的所有表单项,表单的每一个表单项对应一个FileItem

第四步:遍历所有的表单项,判断是否是普通的表单项,如果不是就是文件上传,就可以针对遍历的这个fileItem进行一系列的操作

封装一个工具类,让我们在处理文件上传的时候爽呀爽

在上面我们已经介绍过了使用commons-fileupload上传文件的整个流程,所以我们就直接将这个流程封装成一个工具类,在使用到文件上传的Servlet中直接使用,十分便利

第一步:创建一个DTO(用于存储commons-fileupload解析请求的结果)

import org.apache.commons.fileupload.FileItem;

import java.util.HashMap;
import java.util.Map;

public class ParamDto {

    private Map<String,String> paramMap;
    private Map<String,FileItem> fileMap;

    public ParamDto() {
        paramMap = new HashMap<>();
        fileMap = new HashMap<>();
    }

    public Map<String, String> getParamMap() {
        return paramMap;
    }

    public void setParamMap(Map<String, String> paramMap) {
        this.paramMap = paramMap;
    }

    public Map<String, FileItem> getFileMap() {
        return fileMap;
    }

    public void setFileMap(Map<String, FileItem> fileMap) {
        this.fileMap = fileMap;
    }
}

第二步:将commons-fileupload解析文件的整个请求,封装成一个工具类

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.imooc.dto.ParamDto;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;

public class RequestUtil {

    /**
     * 从request流中解析参数与上传的文件
     * @param request
     */
    public static ParamDto parseParam(HttpServletRequest request) {

        ParamDto result = new ParamDto();

//创建一个FileItem工厂 通过DiskFileItemFactory对象创建文件上传核心组件
        ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
        upload.setHeaderEncoding("UTF-8");

        try {
//通过文件上传核心组件解析request请求,获取到所有的FileItem对象
            List<FileItem> fileItemList = upload.parseRequest(request);

//遍历表单的所有表单项(FileItem) 并对其进行相关操作
            for(FileItem fileItem : fileItemList) {
//判断这个表单项如果是一个普通的表单项
                if(fileItem.isFormField()) {
                    result.getParamMap().put(fileItem.getFieldName(),fileItem.getString("UTF-8"));
//如果不是表单的普通文本域,就是
                } else {
                    result.getFileMap().put(fileItem.getFieldName(),fileItem);
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

第三步:让我们直接在Servlet中使用这个工具类吧,哈哈

另:我们当然可以封装一个保存文件(Item)的一个通用方法

import org.apache.commons.fileupload.FileItem;

import java.io.File;

public class FileUtil {

    /**
     * 上传文件的保存路径
     */
    public static final String SAVE_PATH = "d:/upload/";

    /**
     * 保存上传的文件
     * @param fileItem
     * @param path
     * @return
     * @throws Exception
     */
    public static String save(FileItem fileItem,String path) throws Exception {
        String fileName = System.currentTimeMillis() + "_" + fileItem.getName();
        fileItem.write(new File(path + fileName));
        return fileName;
    }
}

好啦~ 有空我们再来看看原始的文件上传方式

原文地址:https://www.cnblogs.com/jimisun/p/9419269.html

时间: 2024-11-10 03:21:36

Java使用Commons-FileUpload组件实现文件上传最佳方案的相关文章

使用Commons FileUpLoad组件实现文件上传功能

Commons 是Apache开放的源码组织的一个java子项目,该项目主要涉及一些开发中常用的模块,如文件上传,命令行处理,数据库连接池等.FileUpLoad就是其中的一个用于处理HTTP文件上传的子项目.Commons FileUpLoad组建具有以下几个特点: 1.使用简单:Commons FileUpLoad组件可以方便的嵌入JSP文件中,在JSP文件中仅编写少量代码就可完成文件上传功能,十分方便. 2.能够全程控制上传的内容:使用Commons FileUpLoad组件提供的对象及操

使用commons-fileupload-1.2.1.jar等组件实现文件上传

使用的主要jar包:commons-io-1.3.2.jar包;commons-fileupload-1.2.1.jar包:commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前后台的一致性,注意在后台定义File文件对象名要与jsp页面中的file标签name名字一致,前台form标签属性一定要设置为enctype="multipart/form-data",而且传输方式必须是post方式.不然后台不认为提交的是文件类型,而认为是普通表单的提交. 废话不多说看主

用Commons-FileUpload组件实现文件上传

一.用Commons-FileUpload组件实现文件上传 1.导入两个jar包 FileUpload下载地址: http://commons.apache.org/fileupload/ 下载:commons-fileupload-1.2.2-bin.zip    得到:commons-fileupload-1.2.2.jar http://commons.apache.org/io/ 下载:commons-io-1.4-bin.zip       得到:commons-io-1.4.jar

jsp实现文件上传(二)用cos组件实现文件上传

jsp表单 <%@ page language="java" pageEncoding="utf-8"%> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <form action="cos.jsp" method="post" en

jquery组件WebUploader文件上传用法详解

这篇文章主要为大家详细介绍了jquery组件WebUploader文件上传用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件,下文来为各位演示一下关于jquery WebUploader文件上传组件的用法. 使用WebUploader还可以批量上传文件.支持缩略图等等众多参数选项可设置,以及多个事件方法可调用,你可以随心所欲的定制你要的上传组件. 接下来我以图片上

iview Upload组件多文件上传,以及vue文件下载

iview Upload组件多文件上传 系统经常遇到文件上传的问题,iview提供了Upload组建,能够很好的实现文件上传,当然一次上传多个文件也是允许的. 思路:创建一个数组 把需要上传的文件 push到这个数组里面 1.引用组件 2.手动上传,根据官方文档 设置:before-upload ="handleUpload"等于false (1).:before-upload 是 iview Upload 上传组件的一个属性 设置返回值为 false 可以阻止默认上传方式(自动上传模

MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传

本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件.Backload与客户端文件上传插件(比如jQuery-File-Upload)配合使用,初步形成一个处理文件异步上传的解决方案. □ Badkload的一些功能和特点 ● 零配置:Backload提供默认BackloadDemoController用来处理上传文件请求.如果其它控制器也想拥有"B

Java基础——Servlet(八)文件上传下载

一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 <% if(request.getParameter("flag")!=null){ SmartUpload su=new SmartUpload(); su.initialize(pageContext); su.upload(); su.save("/upload_file

dwz+jquery+fileupload+springmvc实现文件上传 及图片预览

1 前台jsp:文件的上传利用了iframe实现局部刷新功能.使用了apache的fileupload组件,用到的jar: commons-fileupload.jar,commons-io.jarDiskFileItemFactory fac = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(fac);upload.setHeaderEncoding("utf-8"); Html代