什么是文件上传?
所谓的文件上传就是将客户端的资源通过网络数据传递到服务端,
为什么要用文件上传?
讲道理,使用响应的方式也可以向服务器端上传文本数据,但是其过程比较费劲,而且如果上传的是图片等资源,则无法通过该方法上传。使用上传文件的更主要原因是因为一般上传的文件数据都很大。
文件上传的本质?
文件上传的本质就是IO流的操作。服务器端通过流读取数据,然后对数据进行解析,得到上传文件的内容,然后保存在服务器端。
客户端如何上传数据?
<1.>method=”post”;因为提交的数据会比较大,所以要使用post提交。
<2.>必须使用要有name属性。
<3.>在input标签中设置属性encType=”Multipart/form-data”。
服务器端如何处理数据?
<1.>用request对象获取请求信息。
<2.>通过request的getInputStream()方法,可以读取到所有请求正文消息。
<3.>操作IO流,将所需要的信息保存在服务器端。
fileupload.jar包是干嘛用的?
commons-fileupload.jar通常和commons-io.jar包一起使用的。用来操作文件上传。里面封装了很多上传的功能,大大简化了我们写上传代码的复杂性。
fileupload包中核心的三个类介绍:
<1.>DiskFileItemFactory类
作用:可以设置缓冲区大小以及临时保存位置。
setSizeThreshold( int sizeThreshold )
设置缓冲区大小,如果不设置,sizeThreshold大小为:10240(10KB)。
setRepository( File repository );
设置临时文件的保存位置,如果不设置,repository为系统的临时目录。
DiskFileItemFactory();
构造一个缓冲区大小为sizeThreshold和临时文件为目录为repository的文件项工厂。
DiskFileItemFactory( int SizeThreshold , File repository );
构造一个带指定参数的文件项工厂类。
<2.>ServletFileUpload类
作用:实现上传的一些实用程序集合。
ServletFileUpload( DiskFileItemFactory factory );
构造函数,使用factory指定的缓冲区大小和临时文件。
public List<FileItem> parseRequest ( HttpSevletRequest request );
解析request对象,得到所有的上传项,返回一个List<FIleItem>集合,其中每个FileItem就相当于一个上传项。
boolean isMultipartContext ( HttpServletRequest request );
用于判断是否为上传项,如果是就返回true。因为上传项中,encType=”Multipart/form-data”,所以如果提交有这条属性,则返回true。
setFileSizeMax(long fileSizeMax);
设置单个文件的上传的大小上限。
setSizeMax(long sizeMax);
设置总文件上传的大小上限。
setHeaderEncoding( Charset charset);
使用charset的编码进行请求进行处理,可以解决文件上传中的中文乱码的问题。
注意: 使用request.setCharacterEncoding ( Charset charset)也可以解决中文乱码问题,但是不建议使用。
<3.>FileItem类
isFormField();
判断是否为上传组件。
String getFieldName();
获取该组件的名称。既:<input>标签中的name属性。
String getName();
获取上传文件中的名称。
注意:浏览器不同,得到的效果会不一样。
1.包含全路径名称: 比如:C:\User\Administrator\demo.txt
2.包含上传文件名称: 比如:demo.txt
getString()、getString(Charset charset)
两者的区别:一个使用默认编码,一个使用指定编码。
可以获取非上传组件的内容。
如果上传组件是文本类型,也可以获取到其文本内容。
getInputStream();
获取上传文件的内容的输入流,使用文件复制就能完成文件的上传。
delete();
删除临时文件。
8 . 中文乱码问题
上传文件名称乱码:
使用ServletFileUpload中的setHeaderEncoding(Charset charset)方法。
非上传组件内容乱码 :
使用FileItem中的getString(Charset charset)方法。