File,DiskFileItemFactory,ServletFileUpload

2023-10-19 23:51

本文主要是介绍File,DiskFileItemFactory,ServletFileUpload,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导读:文件上传组件中,如果对File,DiskFileItemFactory ,ServletFileUpload ,FileItem这四个类理解了,也就理解了文件上传组件。

1.java.io.File类

  • File(File parent,String child)根据parent的抽象路径名和child的路径名,创建一个File实例。
  •  File(String pathname)通过将给定的路径名字符串转换成抽象路径名来创建一个File实例。
  •  File(String parent,String child)根据patent的路径名字符串和child字符串来创建一个File实例。

2.DiskFileItemFactory类

 将请求消息中的每一个项目封装成单独的DiskFileItem(FileItem接口的具体实现)的工作,由org.apache.commons.fileupload.disk.DiskFileItemFactory(org.apache.commons.fileupload.FileItemFactory接口的具体实现)来完成。当上传的文件较小的时候自己存在内存中,比较大时,就保存到磁盘的临时文件夹

  DiskFileItemFactory的属性中,public static intDEFAULT_SIZE_THRESHOD:将文件保存在内存还是临时文件件的默认临界值,默认值是10240,10K。

  private Filerepository用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir获取。如下代码:System.getProperty("java.io.tmpdir");

  private intsizeThreshod:用于保存将文件保存在内存还是临时文件夹的临界值。

构造方法:public DiskFileItemFactory()采用默认临界值系统临时文件夹创建磁盘文件项目工厂;

          public DiskFileItemFactory(int sizeThrehold,File repository)采用sizeThrehold为临界值,                           repository作为临时文件夹来创建磁盘文件项目工厂。                                           

       方法:FileItem createItem()根据DiskFileItemFactory的相关配置将每一个请求消息实体项目创建成

             FileItem实例并返回。该方法从来不需要我们亲自调用,fileupload在解析时自动调用

             void setSizeThrehold(int sizeThrehold)Apache上传组件在解析上传数据的每个字段内容的时候,需要临时保存解析出来的数据,以便后面进一步的处理。因为Java虚拟机默认的可以使用的内存空间上有限的,超出限制时会抛出“java.lang.OutOfMemoryError”的错误。如果上传的文件很大,在内存中将无法临时保存该文件的内容,Apache上传组件转而采用临时文件夹来保存该文件的内容。此方法设置将文件存放在内存还是临时文件夹的临界值。

            voidsetRepository(File respository)此方法设置当文件的大小超出sizeThrehold临界值时,将文件临时文件保存在磁盘上的存放目录有一个对应的获得临时文件夹的方法File getRespository()。没有调用该方法,Tomcat默认的临时目录为“tomcat/temp/”。                         

3.ServletFileUpload类

  org.apache.commons.fileupload.servlet.ServletFileUpload类似apache文件上传组件处理文件上传的核心高级类,使用其parseRequest(HttpServletRequest)方法可以将表单提交的数据封装成FileItem类,然后以List的形式返回。如果你希望进一步提高性能,可以使用getItemIterator方法,直接获得每一文件项的数据输入流,对数据进行直接处理。在使用ServletFileUpload对象解析请求时,需要根据DIskFileItemFactory的属性sizeThrehold ,Respository来决定解析得到的数据是保存在内存还是某个临时目录中。所以,我们要做解析前,构造好DiskFileItemFactory对象。通过ServletFileUpload的构造方法,或者setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性

构造方法:public ServletFileUpload(),构造一个未初始化的实例,需要在解析请求之前调用setFileItemFacotry方法,设置fileItemFactory属性。

                public ServletFileUpload(FileItemFactory fileItemFactory)构造一个实例并根据指定的   FileItemFactory对象设置fileItemFactory属性。

      常用方法:1.public void setSizeMax(long sizeMax)。该方法继承FileUploadBase类,用于设置请求消息实体内容(所有上传的数据)的最大尺寸限制,防止客户端恶意上传大文件浪费服务器的存储空间。在请求解析的过程中,如果请求消息体的内容超过了setSizeMax方法设置值,将会抛出FileUploadBase内部定义的SizeLimitExceededException(FileUploadException的子类)。该方法有一个对应的读方法:public long getSizeMax()。

               2.public void setFileSizeMax(long fileSizeMax),该方法继承自FileUploadBase类,用来设置单个上传文件的最大尺寸。该方法有一个对应的读方法 public long  getFileSizeMax()。在请求解析的过程中,如果单个文件上传的大小超过了setFileSizeMax的设置值,将会抛出FileUploadBase内部定义的FileSizeLimitExceededException 

(FileUploadException异常的子类)异常。

               3.public List parseRequest(javax.servlet.http.HttpServletRequest  request)。parseRequest是ServletFileUpload类的主要方法,它是对Http请求消息体内容进行解析的入口方法。它解析出Form表单中的每一个字段的数据,并将它们分别包装成独立的FileItem对象,然后将这些对象装入一个List类型的集合对象返回。该方法抛出

FileUploadException异常类处理诸如文件尺寸过大,请求消息中的实体内容不是“multipart/form-data”,IO异常,请求消息体长度信息丢失等异常。这些异常都是FileUploadException的一个子类。

               4.public FileItemIterator getItemIterator(HttpServletRequest request)。getItemIterator方法和

parseRequest方法基本相同。但是getItemIterator方法返回的是一个迭代器,该迭代器里面保存的不是FileItem对象,而是FileItemStream对象,如果你希望进一步提高性能,你可以是使用该方法,直接获得每一个文件项的数据输入流,做底层处理。如果性能不是问题,你可以用parseRequest方法。

               5.public  static  boolean isMultipartContent(HttpServletRequest request)。方法的用法和作用如名字所表示的。

               6.getFileItemFactory()和setFileItemFactory(FileItemFactory fileItemFactory)方法继承值

FileUpload类,用于设置和读取fileItemFactory属性。

               7.public void setProgressListener(ProgressListener pListener)。设置文件上传进度监听器,该方法有一个对应的读取方法ProgressListener getProgressListener()。

               8.public void setHeaderEncoding()。在文件上传请求的消息体中,除了普通表单域的值是文本内容外,文件上传字段中的文件路径也是文本内容,在内存中保存的是它们的某种字符编码的字节数组。Apache上传组件中读取这些内容时,必须知道他们采用的字符集编码,才能将它们转换成正确的字符文本返回。setHeaderEncoding 继承自FileUploadBase类,用来设置上面的内容的字符编码。如果没有设置则,对应读方法

getHeaderEncoding()得到的是null,将采用HttpServletRequest设置的字符编码。如果HttpServletRequest的字符编码也为null ,则采用系统默认编码。可以通过System.getProperty(“file.encoding”)获得系统默认字符编码。


这篇关于File,DiskFileItemFactory,ServletFileUpload的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/243193

相关文章

Open a folder or workspace... (File -> Open Folder)

问题:vscode Open with Live Server 时 显示Open a folder or workspace... (File -> Open Folder)报错 解决:不可以单独打开文件1.html ; 需要在文件夹里打开 像这样

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

file-max与ulimit的关系与差别

http://zhangxugg-163-com.iteye.com/blog/1108402 http://ilikedo.iteye.com/blog/1554822

瑞芯微Parameter File Format解析

Rockchip android系统平台使用parameter文件来配置一些系统参数 主要包含:串口号:nandflash分区 固件版本,按键信息等; 如下是台电P98HD的parameter参数: FIRMWARE_VER:4.1.1        // 固件版本 //固件版本,打包 updata.img 时会使用到,升级工具会根据这个识别固件版本。 //Boot loader 会读取

error while loading shared libraries: libnuma.so.1: cannot open shared object file:

腾讯云CentOS,安装Mysql时: 1.yum remove libnuma.so.1 2.yum install numactl.x86_64

Vue3图片上传报错:Required part ‘file‘ is not present.

错误 "Required part 'file' is not present" 通常表明服务器期望在接收到的 multipart/form-data 请求中找到一个名为 file 的部分(即文件字段),但实际上没有找到。这可能是因为以下几个原因: 请求体构建不正确:在发送请求时,可能没有正确地将文件添加到 FormData 对象中,或者使用了错误的字段名。 前端代码错误:在前端代码中,可能

File 的创建

在做音频录制的时候,用到创建一个音频文件,所以用到了如下方法 File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+ System.currentTimeMillis()+".mp3");if (!file.exists()){file.createNewFile();} 可是

clang: error: no such file or directory: '/Users/bigxin/Desktop/not file xxx

这样的问题,解决方法有以下几种: 第一:一般多人开发的时候会出现文件缺失的问题,遇到这个问题就根据提示找到对应的地址,然后会发现这个文件名字是红色的把红色的文件删除,然后重新addfile,然后把缺失的文件拷贝过来就可以了。。第二:如果第一种方法不行的话,可以移步到 TARGETS —-> Build Phases ——> Compile Sources(编译源) 里面来找,看有没有失效的文件