1.客户端上传文件:在web页面中添加上传输入项":<input type="file" name="filename">
(1)file输入项必须有name属性才能提交
(2)上传用的表单必须是POST提交,因为GET提交提交的参数将以URL后请求参数的方式提交,大小有限只能是1k
(3)上传用的表单设置enctype为multipart/form-data
只要把enctype为multipart/form-data,提交时请求的正文将会被分割为多个部分,每个部分都对应一个上传项,其中代表文件上传的项中会有文件的内容
2.服务器端接受处理文件
使用Apache提供的Commons-fileupload实现文件上传
需要导入两个包:commons-fileupload-1.2.1.jar 和commons-io-1.4.jar
(1)DiskFileItemFactory ---
文件上传工厂类,用来生产文件上传核心类
public DiskFileItemFactory(int sizeThreshold, java.io.File repository)
public DiskFileItemFactory()
public void setSizeThreshold(int sizeThreshold)
public void setSizeThreshold(int sizeThreshold)
如果不设置则内存缓冲区的大小为10K,临时文件夹的位置和具体的操作系统有关,可以用System.getProperty("java.io.tmpdir")获取当前系统的默认临时文件夹的位置
(2)ServletFileUpload --
文件上传的核心类,可以用来解析request对象,将每个字段项或文件上传项封装为FileItem对象组成集合后返回
boolean isMultipartContent(HttpServletRequest request) 判断上传表单是否为multipart/form-data类型
List parseRequest(HttpServletRequest request)
解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
setFileSizeMax(long fileSizeMax)
设置单个上传文件的最大值
setSizeMax(long sizeMax)
设置上传文件总量的最大值
setHeaderEncoding(java.lang.String encoding)
设置编码格式,解决上传文件名乱码问题
setProgressListener(ProgressListener pListener)
实时监听文件上传状态
(3)FileItem--
判断自己是一个文件上传项还是一个普通字段项
boolean isFormField() 判断FileItem是一个文件上传对象还是普通表单对象
如果是一个普通字段项,可以获取字段项的名和值
String getFieldName() 获得普通表单对象的name属性
String getString(String encoding) 获得普通表单对象的value属性,可以用encoding进行编码设置,解决表单中中文的问题;
如果是一个文件上传项,可以获取文件名和指向文件正文的流
String getName() 获得上传文件的文件名(有些浏览器会携带客户端路径)
InputStream getInputStream() 获得上传文件的输入流
工具类IOUtils.java:
(1)file输入项必须有name属性才能提交
(2)上传用的表单必须是POST提交,因为GET提交提交的参数将以URL后请求参数的方式提交,大小有限只能是1k
(3)上传用的表单设置enctype为multipart/form-data
只要把enctype为multipart/form-data,提交时请求的正文将会被分割为多个部分,每个部分都对应一个上传项,其中代表文件上传的项中会有文件的内容
2.服务器端接受处理文件
使用Apache提供的Commons-fileupload实现文件上传
需要导入两个包:commons-fileupload-1.2.1.jar 和commons-io-1.4.jar
(1)DiskFileItemFactory ---
文件上传工厂类,用来生产文件上传核心类
public DiskFileItemFactory(int sizeThreshold, java.io.File repository)
public DiskFileItemFactory()
public void setSizeThreshold(int sizeThreshold)
public void setSizeThreshold(int sizeThreshold)
如果不设置则内存缓冲区的大小为10K,临时文件夹的位置和具体的操作系统有关,可以用System.getProperty("java.io.tmpdir")获取当前系统的默认临时文件夹的位置
(2)ServletFileUpload --
文件上传的核心类,可以用来解析request对象,将每个字段项或文件上传项封装为FileItem对象组成集合后返回
boolean isMultipartContent(HttpServletRequest request) 判断上传表单是否为multipart/form-data类型
List parseRequest(HttpServletRequest request)
解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
setFileSizeMax(long fileSizeMax)
设置单个上传文件的最大值
setSizeMax(long sizeMax)
设置上传文件总量的最大值
setHeaderEncoding(java.lang.String encoding)
设置编码格式,解决上传文件名乱码问题
setProgressListener(ProgressListener pListener)
实时监听文件上传状态
(3)FileItem--
判断自己是一个文件上传项还是一个普通字段项
boolean isFormField() 判断FileItem是一个文件上传对象还是普通表单对象
如果是一个普通字段项,可以获取字段项的名和值
String getFieldName() 获得普通表单对象的name属性
String getString(String encoding) 获得普通表单对象的value属性,可以用encoding进行编码设置,解决表单中中文的问题;
如果是一个文件上传项,可以获取文件名和指向文件正文的流
String getName() 获得上传文件的文件名(有些浏览器会携带客户端路径)
InputStream getInputStream() 获得上传文件的输入流
delete() 在关闭FileItem输入流后,删除临时文件
入门代码:UploadServlet.java
package com.oterman.web;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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 com.oterman.utils.IOUtils;
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//1.构建工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//2.由工厂生产文件上传的类;
ServletFileUpload upload=new ServletFileUpload(factory);
//解决文件名乱码;
upload.setHeaderEncoding("utf-8");
//3.解析request对象;
List<FileItem> itemList=null;
try {
itemList = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
for(FileItem item:itemList){
if(item.isFormField()){
//输入的是非文件项
String name=item.getFieldName();
String value=item.getString("utf-8");//解决表单中的中文乱码问题;
System.out.println("name:"+name+" value:"+value);
}else{
//输入的是文件项;
String filename=item.getName();
//解决ie文件名问题;ie上传文件时,文件名带着路径;
filename=filename.substring(filename.lastIndexOf("\\")+1);
InputStream in=item.getInputStream();
OutputStream out=new FileOutputStream(this.getServletContext().getRealPath("/upload/"+filename));
IOUtils.in2out(in, out);
IOUtils.close(in, out);
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
工具类IOUtils.java:
package com.oterman.utils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
public class IOUtils {
private IOUtils(){}
//字节流输出
public static void in2out(InputStream in,OutputStream out) throws IOException{
byte[] buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
}
//字符流输出;
public static void in2out(Reader in,Writer out) throws IOException{
char[] buf=new char[1024];
int len=0;
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
}
//关闭流
public static void close(InputStream in,OutputStream out) throws IOException{
in.close();
out.close();
}
}