文件上传技术
- serlet3.0技术
- JSPSmartUpload jsp +javabean的开发模式,用在jsp里
- FileUpload 实现的是java环境下的文件上传
- 以及各大开发框架大多使用的是上面FileUpload的技术,对其进行了封装,例如Spring中的CommonsMultipartFile类也是实现文件上传的技术,其实也是封装了FileUpload技术
文件上传的三要素
- 表单提交方式为post
- 表单中需要有文件上传表单项,必须有name属性
<input type="file" name="upload">
- 表单的enctype的属性值需要是multipart/form-data
API介绍
- FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,组件FileUpload依赖于Commons IO组件,因此在继续之前,要确保在你的工程有相应的jar包支持
- 在commons.apache.org下载需要的jar包下载的地址为:
http://commons.apache.org/downloads/index.html,需要下载IO和FileUpload支持的jar包,下载release发布版本,下载binaries(二进制)版本,编译好的版本
核心类介绍
-
DiskFileItemFactory 磁盘文件项工厂
ServletFileUpload 核心解析类
FileItem 文件项 (是一个接口,如果要看源码,实现类为:DiskFileItem 位置:org.apache.commons.fileupload.disk.DiskFileItem,可以看见相应的源码的实现) -
官方参考文档:http://commons.apache.org/proper/commons-fileupload/apidocs/index.html
jsp demo如下
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>文件上传</h1>
<form action="${pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
<input type="text" name="name"><br/>
<input type="file" name="upload"><br/>
<input type="submit" value="上传">
</form>
</body>
</html>
java demo如下
@WebServlet(urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
File file =new File("G:\\test");
//如果服务器上传的文件名称出现乱码,可以设置下面请求的编码。(可选项)
request.setCharacterEncoding("UTF-8");
// 1.创建磁盘文件项工厂(1k=1024bytes(字节)),设置初始缓冲区的大小为1M,设置默认缓冲文件位置为file,
//当上传文件大于缓冲区大小时,fileupload组件将使用临时文件缓存上传文件
//也可以使用默认无参构造,默认为:缓冲区为10k,位置:java.io.tmpdir
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(1024*1024,file);
// 2.创建核心解析类
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
//设置所有上传数据的最大值,单位字节long 100M (可选项)
fileUpload.setSizeMax(1024*1024*100);
//设置单个文件上传的最大值 10M (可选项)
fileUpload.setFileSizeMax(1024*1024*10);
//设置编码格式 (可选项)
fileUpload.setHeaderEncoding("UTF-8");
// 3.解析请求对象,将请求分成几个部分(FileItem)
try {
List<FileItem> list= fileUpload.parseRequest(request);
// 4.遍历集合获得每个部分的对象
for(FileItem fileItem:list){
// 判断是普通项还是文件上传项
if(fileItem.isFormField()){
// 普通项
// 获得普通项的名称:
String name = fileItem.getFieldName();
// 获得普通项的值:
String value = fileItem.getString("UTF-8");
System.out.println(name+" "+value);
}else{
// 文件上传项
// 获得文件的名称:
String fileName = fileItem.getName();
// 获得文件的输入流:
InputStream is = fileItem.getInputStream();
// 需要将文件写入到服务器的某个路径即可:[可以自己定义一个服务器的路径]
String path = getServletContext().getRealPath("/upload");
System.out.println(path);
// 创建输出流 与 输入流进行对接:向该路径下输出文件
OutputStream os = new FileOutputStream(path+"\\"+fileName);
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!=-1){
os.write(b, 0, len);
}
is.close();
os.close();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}