文件上传
文件上传要素
1.表单的提交方式必须是post
2.表单中需要有元素,需要有name属性和值
3.表单enctype="multipart/form-data"
上传文件所需jar包
commons-fileupload.jar
commons-io-2.11.0.jar
HTML代码片段
例:(form标签中action指向的是servlet )
<body>
<h1>文件上传</h1>
<!-- 文件上传三要素
*表单需要是post提交
*表单中需要文件上传项,必须有name的属性和值
*表单的enctype属性必须是multipart/form-data
-->
<form action="upload" method="post" enctype="multipart/form-data" >
文件描述:<input type="text" name="info" ><br/>
文件上传:<input type="file" name="upload"><br/>
<input type="submit" value="上传" />
</form>
</body>
文件上传代码片段
例: (提交到servlet中代码)
//1.创建磁盘文件项工厂
DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
//2.创建一个核心的解析类
ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
//3.利用核心类解析Request,解析后会得到多个部分。返回一个List集合。List集合装的每个部分的内容(FileItem文件项)。
try {
List<FileItem>list= fileUpload.parseRequest(request);
//4.遍历List集合,会得到代表每个部分的文件项的对象。根据文件项判断是文件上传项
for(FileItem fileItem:list) {
//判断这个文件项是普通项还是文件上传项。
if(fileItem.isFormField()) {
//普通项:
//接受普通项的值:(接收值不能再使用request.getParameter())
String name=fileItem.getFieldName();//获得普通项的名称
//获得普通项的值
String value=fileItem.getString("UTF-8");
}else {
//文件上传项:
//获得文件上传项的文件的名称:
String filename=fileItem.getName();
//获得文件上传的文件的数据:
InputStream is=fileItem.getInputStream();
//获得文件上传的路径:磁盘绝对路径。
String realPath=getServletContext().getRealPath("/upload");
//创建一个输出流,写入到设置的路径中
OutputStream os=new FileOutputStream(realPath+"/"+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();
}
扩展
构造方法:
DiskFileItemFactory();
DiskFileItemFactory(int sizeThreshold,Java.io.File repository);
参数 sizeThreshold和 repository注解
- sizeThreshold:设置文件上传的缓冲区大小,默认值为10kb
- repository:设置文件上传过程中产生临时文件存放的路径
setSizeThreshold和setRepository注解及使用
- setSizeThreshold:设置缓冲区大小
- setRepository:设置文件上传过程中产生临时文件存放的路径
代码片段
//1.创建磁盘文件项工厂
DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
//1.1设置缓冲区的大小:
diskFileItemFactory.setSizeThreshold(3*1024*1024); //设置缓冲区的大小为3M
//1.2设置临时文件存放的路径:
//获得临时文件存放的路径:
String tempPath=getServletContext().getRealPath("/temp");
diskFileItemFactory.setRepository(new File(tempPath));