使用Commons-fileupload 组件上传时,获取表单其它元素系列问题集锦

使用commons-fileupload组件上传文件(随笔)          1.第三方控件又被称为是第三方组件,使用第三方组件,可以避免大量编码,减少开发工作量及由于逻辑或算法造成的程序异常,从而降低开发成本,提高开发效率。由于第三方组件是第三方组织或者个人提供的,在开发时提供的版本可能会出现Bug,一些缺点,解决时就相当麻烦;但是对于应用也是很广泛,有很明显的优势,其中,commons-fileupload组件是由Apache开发的一个应用于文件上传... 阅读详情


如果在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件:

 

当表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data

在 form 元素的语法中,enctype 属性指定将数据发送到服务器时浏览器使用的编码类型。

enctype 属性取值:

application/x-www-form-urlencoded:表单 enctype 属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用”%HH”代替(H 代表十六进制数字)。对于大容量的二进制数据或包含非 ASCII 字符的文本来说,这种编码不能满足要求。

multipart/form-data:form 设定了enctype=“multipart/form-data”属性后,表示表单以二进制传输数据 .

 

Commons-fileupload 组件上传的基本原理

FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的 request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中

 

Commons-fileupload 组件API

ServletFileUpload 负责处理上传的文件数据,并将每部分的数据封装成一到 FileItem 对象中。

DiskFileItemFactory 是创建 FileItem 对象的工厂,在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录。

ServletFileUpload 在接收上传文件数据时,会将内容保存到内存缓存区中,如果文件内容超过了 DiskFileItemFactory 指定的缓冲区的大小,那么文件将被保存到磁盘上,存储为 DiskFileItemFactory 指定目录中的临时文件。等文件数据都接收完毕后,ServletUpload 在从文件中将数据写入到上传文件目录下的文件中

 

 

进行文件上传和下载的具体操作:

首先,加载必要的jar包:“commons-fileupload-1.2.1.jar”,“commons-io-1.4.jar”

步骤:

0. 创建 FileItemFactory 子类 DiskFileItemFactory 的对象

1.为了得到 ServletFileUpload 对象, 先需要得到 FileItemFactory 的一个对象, 然后调用 new ServletFileUpload(FileItemFactory fif); 方法得到 ServletFileUpload 对象

2.为了得到 FileItem 的集合, 先需要得到 ServletFileUpload 对象, 然后调用该对象的 parseRequest() 方法得到 FileItem 的 List

3.从 HttpServletRequest 对象中得到 FileItem 的集合

4. 对上述集合进行遍历:判断是表单域还是文件域

 

下面是对文件上传相关操作的代码示例。

//1. 验证是否使用 FileUpload 组件

        boolean isMultipart = ServletFileUpload.isMultipartContent(request);

      

        //2.1  不使用

        if(!isMultipart){

            response.getWriter().println("没有文件域");

            return;

        }

      

        //2.2 使用

      

        //3. 获取 DiskFileItemFactory 对象

        DiskFileItemFactory itemFactory = new DiskFileItemFactory();

      

        //4. 获取 ServletFileUpload 对象

        ServletFileUpload fileUpload = new ServletFileUpload();

        fileUpload.setFileItemFactory(itemFactory);

        设置上传文件的最大大小

        fileUpload.setFileSizeMax(1000 * 100);

      

        String forwardPage = null;

      

        try {

            //5. 调用 ServletFileUpload 的 parseRequest() 方法, 获取 FileItem 的集合

            List<FileItem> items = fileUpload.parseRequest(request);

          

            Map<String, String> paramMap = new HashMap<String, String>();

            FileItem fileItem = null;

          

            //6. 对 5 获取的集合进行遍历

            Iterator<FileItem> it = items.iterator();

            while(it.hasNext()){

                FileItem item = it.next();

                //7. 验证是否为表单域

                if(item.isFormField()){

                    //7.1 是表单域, 把获取到得 表单域的 fieldName 和 value 放在 map 中.

  获得表单中该字段的字段名

                    String fieldName = item.getFieldName();

获得表单中与上面字段名对应的字段值

                    String value = item.getString("UTF-8");

                  

                    paramMap.put(fieldName, value);

                }

                    //7.2 不是表单域, 即为文件域. 获取 FileItem 对象, 注意限制条件.

                else{

这里获得了与file对应的FileItem对象

                    fileItem = item;

                }

                  

            }

          

            //8. 对 7.2 获取的 FileItem 对象进行文件上传操作.

            //10.1 获取全路径名

            String path = null;

          

            path = this.getServletContext().getRealPath("/photoes");

          

            File photoesDir = new File(path);

            if(!photoesDir.exists()){

                photoesDir.mkdir();

            }

          

            path = path + "/" + paramMap.get("username");

          

            File file = new File(path + ".jpg");

          

            //10.2 上传操作,把用户在页面上传的文件保存到服务器

            fileItem.write(file);

 

上传文件表单的两个准备工作

1. 提交方式改为 POST

2. enctype 属性的取值改为 multipart/form-data

 

在获取表单值时

1. 不能使用 request.getParameter() 方法, 因为该方法仅能获取字符串, 对二进制无能为力.

2. 使用 fileUpload 组件读取上传文件及表单域字段.

 

fileUpload 组件的核心思想

fileUpload 组件认为: 所有的表单域(包含文件域和文本域)都是 FileItem 对象.

步骤:

1. 获取 FileItem 对象组成的 List

2. 对 List 进行遍历

3. 判断每一个  FileItem 对象是表单域 还是 文件域, 以进行不同的处理.

 

详细步骤:

1. 检查表单的 enctype 是否为 multipart/form-data, 以决定是否使用 FileUpload 组件进行解析请求

2. 若表单的 enctype 是否为 multipart/form-data, 则需要获取 封装了所有表单域 的对应的 FileItem 对象的 List: List<FileItem> list = null;

   3) 获取 ServletFileUpload 对象, 调用该对象的 public java.util.List parseRequest(javax.servlet.http.HttpServletRequest request)

               方法获取封装 FileItem 的List

   2) 需要使用 ServletFileUpload 的构造器来创建 ServletFileUpload 对象:

      ^ 使用任意一个构造器都可以得到 ServletFileUpload 对象, 但都需要先得到 FileItemFactory 对象

      * ServletFileUpload upload = new ServletFileUpload();

          upload.setFileItemFactory(factory);

        * ServletFileUpload upload = new ServletFileUpload(factory);

   1) 创建 FileItemFactory 接口是想类对象: DiskFileItemFactory, 直接创建该对象.

3. 可以调用 DiskFileItemFactory 的相关方法来对文件上传进行一些优化:

   1) setSizeThreshold(int sizeThreshold):设置使用临时文件夹的大小.

   2) setRepository(): 设置临时文件夹

4. 可以调用 ServletUpload 的方法进行文件上传的一些控制

   1) setFileSizeMax: 设置单个文件的最大上传值

   2) setSizeMax:设置总上传文件的最大值, 以 byte 为单位.

5. 关于中文乱码的问题:

   1) 在解析 request 之前: request.setCharacterEncoding("UTF-8"); 可以解决文件域的乱码问题

   2) 在解析表单域时需要使用: new String(value.getBytes("iso-8859-1"), "UTF-8"); 解决中文乱码问题.

但是有时候,即使我们按照上面方式设置了,可以还是中文乱码,这个时候问题多半就出在tomcat的配置上了,打开tomcat的service.xml文件,在那里面注意下面部分

 <Connector port="8989" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" useBodyEncodingForURI="true"/>

只有加上了红色部分的设置,我们在程序中配置EncodingUrl才能起作用。

 3)String value = fileItem.getString("UTF-8") ;

下面一段代码是文件下载的相关操作

//1. 设置响应报头 contentType: application/x-msdownload -->

        //   告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本地的下载文件

        //response.setHeader("conent-type", "application/x-msdownload");

        response.setContentType("application/x-msdownload");

      

        //2. 设置响应抱头 Content-Disposition: attachment -->

        //   Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中

        response.setHeader("Content-Disposition", "attachment; filename=haha.ppt");

      

        //3. 利用 response.getOutputStream() 进行 io 操作

        OutputStream os = response.getOutputStream();

        BufferedOutputStream bos = new BufferedOutputStream(os);

      

        //文件的输入流

        InputStream is = null;

        is = new FileInputStream("E:\\source\\090515\\javaee\\fileupload\\fileUpload.ppt");

        BufferedInputStream bis = new BufferedInputStream(is);

      

        int length = 0;

        byte [] temp = new byte[1 * 1024 * 10];

        while((length = bis.read(temp)) != -1){

            bos.write(temp, 0, length);

            System.out.println("循环操作中...");

        }

      

        bis.close();

        bos.close();

 

但是上面的这种方式无法被迅雷之类的下载工具下载,如果希望被迅雷之类的东西下载,就直接这么写就可以了

request.getRequestDispatcher("/data/fileUpload.ppt")

            .forward(request, response);

文件上传——FileUpLoad—基于apache提供的commons组件提供的上传组件 文件上传 一、需求 将文件上传到指定目录中 二、附加需求 若上传的文件名相同,则产生一个不重复的文件名进行上传,如何处理? 若是只能上传图片文件,又该怎么进行处理? 三、大体思路 1、在进行文件上传之前,我们需要导入文件上传的所需jar包,如下图: 2、我们还需要一个能够提交表单的html网页,并且类型必须为文件提交表单,即必须在网页中设置form的enctype=“multipart/... 阅读详情

相关推荐

掌握Apache Commons FileUpload进行文件上传

对于某些特定需求,可能需要修改ServletFileUpload默认的解析策略。比如,当上传文件数量非常大或单个文件非常大时,默认的解析策略可能不适用。// 示例代码 - 自定义解析策略// 设置仓库大小上限// 设置请求大小上限// 尊重请求体编码// 添加自定义项处理器,例如重命名上传的文件// 实现文件重命名逻辑});在自定义解析策略时,需要考虑请求体的最大大小、存储仓库的大小限制以及是否尊重请求体的编码。

weixin_42527589的博客 1163

基于表单的文件上传

[code="java"] 如果在表单中使用表单元素 ,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件: 当表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data 在 form 元素的语法中,enctype 属性指定将数据发送到服务器...

forhope的专栏 240

深入掌握Apache Commons FileUpload库及其应用

本文还有配套的精品资源,点击获取 简介:Apache Commons FileUpload是一个Java库,专门用于HTTP文件上传。该库的1.3.2版本支持JDK 1.5及以上版本,并填补了标准Java Servlet API在处理multipart/form-data编码的文件上传方面的空白。本文详细介绍了FileUpload库的核心组件、使用步骤、特性以及如何结合其他...

weixin_42128315的博客 2012

upload上传 -- 取不到form表单里的parameter

上传操作时,form表单中使用了enctype="multipart/form-data"后, 再用平时的request取form中的参数就无法获得了,一般上传组件都有自己取form中参数的方法。 如果参数比较少,可以将参数放在action的url中传入,此时servlet中就可以使用request获得参数值了。 或者用隐藏域传值,同样可以使用request获取参数值。 转载于:https:...

weixin_30830327的博客 227

农经权二轮延包—地块示意图生成

本文介绍了地块示意图制作软件的使用方法及模板制作要点。软件通过设置六个参数(示意图模板、属性数据、地块DBF、导航图、地块图片及存放位置)自动生成Word文档,并可导出PDF。文章详细说明了5页Word模板的制作过程,包括页脚三栏设置和页码插入技巧,支持每户最多28个地块的情况。同时指出该软件生成的图片分辨率(300dpi)满足清晰度要求,并提及软件免费提供插件但收费提供后续服务。

weixin_47364423的博客 1113

RAG开源框架深度评测:从RAGFlow到Dify的实战选型指南

本文深度评测了主流RAG开源框架(RAGFlow、Dify、WeKnora)的核心能力与实战表现,提供企业级选型指南。重点对比了文档解析、检索性能和生产部署等关键指标,揭示RAGFlow在复杂文档处理、Dify在低代码开发、WeKnora在腾讯生态集成的差异化优势,并给出技术选型决策树与成本优化方案。

weixin_29294597的博客 825

JSP的FileUpload(上传图片)应用

Apache FileUpload文件上传组件API解析        Java Web开发人员可以使用Apache文件上传组件来接收浏览器上传的文件,该组件由多个类共同组成,但是,对于使用该组件来编写文件上传功能的Java Web开发人员来说,只需要了解和使用其中的三个类:DiskFileUpload、FileItem和FileUploadException。这三个类全部位于org.apac

3392

openEuler服务器离线安装实战:从Docker到Samba的完整避坑指南

本文提供了一份详尽的openEuler服务器离线部署实战指南,重点解决了在无网络环境下安装Docker、Samba等软件的依赖难题。文章深入对比了`dnf install`、`rpm`直接安装及禁用仓库安装三种核心方法,并分享了构建本地DNF仓库的进阶策略,旨在帮助运维人员构建高效可靠的离线部署工作流。

weixin_29210759的博客 71

commons-fileupload实现文件上传

版权声明:本文为 小...

别抢我蓝buff 1934

基于YOLO26深度学习框架的人脸识别门禁系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的人脸识别门禁系统实现方法。系统采用YOLO26目标检测算法,通过CSPDarknet53主干网络、特征金字塔结构和注意力机制实现高效人脸检测。研究内容包括数据预处理、模型训练优化和身份验证等关键技术,使用迁移学习策略和CIoU损失函数提升检测精度。该系统可应用于智能安防场景,具有实时性强、识别准确的特点,为门禁管理提供了智能化解决方案。

一键难忘的博客 766

什么是 SAPGUI 里的 Logon Group/Server

这意味着,不同的用户连接可以被分配到不同的应用服务器,以实现均衡的资源利用和降低某一服务器的负载压力。在这种配置下,欧洲的用户登录时选择“EUROPE_GROUP”,系统将自动选择一个位于欧洲的数据中心的服务器进行连接,这样不仅减少了网络延迟,还实现了服务器间的负载均衡。用户在 SAPGUI 中登录时,只需选择相应的 Logon Group(例如“FIN_GROUP”),系统就会自动将他们的连接请求分配到当前负载最小的应用服务器上,这种动态分配大大提升了系统的响应速度和稳定性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1069

MultipartFile上传文件Spring MVC中加入xml配置,启动即报错!找不到类: org/apache/commons/fileupload/FileItemFactory最全解决方法

@[TOC]MultipartFile上传文件Spring MVC中加入xml配置,启动即报错!找不到类: org/apache/commons/fileupload/FileItemFactory最全解决方法 Error creating bean with name ‘multipartResolver’: Failed to introspect bean class [org.spring...

ImBiTion6的博客 1481

5.4 GTT BO的内存分配分析

本文分析了AMD GPU驱动中的GTT技术实现。GTT作为GPU页表,负责管理主机内存与GPU虚拟地址的映射,支持大容量内存访问和统一寻址。文章详细介绍了GTT的核心数据结构amdgpu_gtt_mgr、初始化流程,以及BO(Buffer Object)创建时GTT区间的分配与释放机制。GTT管理通过TTM框架实现分层设计,提供内存统计、兼容性检查等接口,并支持动态迁移、多进程隔离等高级特性。该机制为AMD GPU提供了高效灵活的内存管理基础。

图形/计算GPU的驱动与虚拟化技术分享园地 3728

idea使用Commons-FileUpload组建实现文件上传-以图片为例

1.file-upload组件FileUpload组件,也叫文件上传组件,是Apache提供的开源项目组件使用方法:引入commons-fileupload-1.2.1.jar,commons-io-1.4.jar在官网下载jar包,引入jar文件1.添加jar包的快捷方法将jar包复制粘贴到lib文件夹下,然后也就是在你需要导入的Jar包上,点击右键,选择Add as Library…2.前台页...

xiaotaozisha的博客 3775

WPS Office JS宏实现文件和数据的上传及下载

WPS Office JS宏下载、上传文件;通过加载项实现数据的获取和上传。

学点笔记 4300

【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】

在 Kubernetes 中,Service 是一种抽象,用于定义一组 Pod 的访问策略。当某些 Pod 接收的流量过多,而其他 Pod 的流量较少时,可能会导致负载不均衡。这种情况不仅影响性能,还可能导致某些 Pod 过载,影响应用的可用性。本文将详细分析此问题的原因及其解决方案。

颜淡慕潇 8737

利用Jakarta commons fileupload组件实现多文件上传

利用Jakarta commons fileupload组件实现多文件上传         曾经写过一篇 文章《利用MultipartFile实现文件上传》,可是最近在工作中,我需要同时上传多个文件,似乎用MultipartFile就不能胜任了,于是想到了Jakarta commons。Jakarta commons真是不错的,有那么多开源且好用的东东,太方便了。好了,闲话少说,开始介

hbcui1984的专栏 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

commons-fileupload实现文件的上传

1.准备两个JAR包: commons-fileupload-1.3.3.jar 和 commons-io-2.5.jar,(直接百度上就能找到) 2.开始写代码 a. 上传文件的表单,即JSP页面&lt;form action="&lt;%=basePath%&gt;servlet/FileUploadServlet" method="post......

warom 9777

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java上传组件commons-fileupload的一些使用方法

在 http://www.apache.org,下载commons-fileupload-1.2.1.jar包,并把这个包加到工程中,以下是记录这个上传组件的一些使用方法。          html测试页面,实现上传两个文件,并填写四个参数。   本人名称: dd> 银行账户: 开户银行: 身份证号: 身份证照片: 银行卡照片:

知行合一 5980

JSP操作之使用Commons-FileUpload组件实现文件上传

我们在访问页面的时候可以浏览其他人的文件,而且很多人有自己个性化的博客,那么这个个性化的图片怎么上传?现在使用Commons-FileUpload组件,下面学习一下。

雪落无痕的博客 2550

使用Apache Commons FileUpload组件上传文件

引入依赖: <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</versi...

Coding Farmer的博客 1104

Java使用Apache的FileUpload组件进行文件上传

Java使用Apache的FileUpload组件进行文件上传

一碗单炒饭的专栏 2000

使用commons-fileupload组件实现文件上传

1.获取commons-fileupload组件      在http://jakarta.apache.org/site/downloads下载这个组件,解压文件后将commoms-fileupload-1.2.jar复制到WEB-INF/lib目录下 2.在使用commons-fileupload组件时,需要另外一个组建commoms-io支持,可以到http://jakarta.apac

vaecherisher的专栏 854

利用commons-fileupload 上传图片(包含表单数据)

在一个表单中包含普通文本数据,另外还有需要上传的图片,那么本程序将图片保存到服务器上的一个图片目录中,文本数据则获取然后输出,查看传输是否正确,后面的处理为涉及。 上传的jsp页面: 最后将信息输出:(图片已经保存在特定目录中) 需要用到的两个jar包,commons-fileupload-1.2.2.jar  commons-io.jar jsp页面: [html]

xyjikl 2628

使用commons-fileupload和commons-io解析表单,做原生文件上传

使用commons-fileupload和commons-io解析表单,做原生文件上传 这里介绍使用apache的文件上传工具类做原生的文件上传 创建一个动态web项目,并把两个必要的jar包放到lib目录下,即commons-fileupload和commons-io 2.写一个servlet类,并在web.xml文件中做好配置,上图中已经配置好了web.xml protected vo...

慧写代码 1768

文件上传-通过commons_FIleUpload实现

一、Commons-FileUpload简介:Apache提供的实现文件上传的组件;免费的、开源的。组件特点: 使用简单:可以方便的嵌入到JSP页面中,缩写少量代码就可以完成文件上传功能。 能够全程控制上传内容。 能够对上传文件大小、类型进行控制。 FileItem接口: 封装表单元素的数据。(不同类型的表单元素分别对应一个FileItem对象) 具有对表单内容处理的方法。 FileItemFac

北京Java青年 1780
上一篇: 大三下已逝二月
下一篇: 使用iframe框架传值时,子窗口无法直接获得父窗口的参数值
M_none
博客等级 码龄16年 3粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值