文件的上传存在的意义
在项目中经常上传文件:qq上传图片,相册上传图片,资料的共享……
实现文件上传的步骤
1.指定表单的类型为文件上传表单
必须指定表单的属性 enctype="multipart/form-data"
<form action="" method="post" enctype="multipart/form-data>
<input type="file" name="files"/>
2.提交方式必须为post
手动上传文件处理
//获取表单中的文件
//获取输入流
InputStream in = request.getInputStream();
//转换流
InputStreamReader inReader = new InputStreamReader(in);
//定义缓冲流
BufferedReader br = new BufferedReader(inReader);
处理数据文件
Content-Disposition: form-data; name="files"; filename="D:\01readme.txt"
Content-Type: text/plain
需要具体处理文件,必须处理 Content-Disposition
在开发中使用文件上传组件来上传文件
一个好的组 最大的特点:简单易用 安全 其次是功能强大
通常使用fileupload组件上传文件 需要引入的包
1.commons-fileupload-1.2.1.jar
2.commons-io-1.4.jar
//创建文件上传工程类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
FileItemFactory 把每一个表单请求对象封装成一个FileIteam对象
fac.serRepository(repository)设置文件上传的临时目录
默认为服务器的temp目录
虚拟机最大内存 在Windows下为1g 在 linux下最大为16g。
//先创建文件上传核心类对象
ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
作用:可以获取所有的FileItem对象
upload.parseRequest(request);返回值类型List,获取所有文件上传项
Boolean isMultipartContent(request)判断表单的类型
upload.setFileSizeMax(fileSize)设置单个文件的最大值
upload.setSizeMax(fileSize)设置上传文件(所有的文件)的最大值
upload.setHeaderEncoding(编码方式);相当于request.setContentType(编码方式);
//判断是否是文件上传表单
if (ServletFileUpload.isMultipartContent(request)) {
//把请求数据转换为FileIteam对象集合
try {
//list中放置的每一个上传项
List<FileItem> list = upload.parseRequest(request);
//遍历每一个上传项
for (FileItem fileItem : list) {
//判断是普通表单,还是文件上传项
if (fileItem.isFormField()) {
//普通表单
String fileName = fileItem.getFieldName();
//文本框的值
String str = fileItem.getString();
} else {
//文件表单
//表单元素名字
String fileName = fileItem.getFieldName();
//文件的类型
String contentType = fileItem.getContentType();
//获取文件名字
String name = fileItem.getName();
//获取文本框的值 即文件内容
String str = fileItem.getString();
//设置请求的编码 处理编码
fileItem.getString("编码方式");
//把文件写到指定的目录下
fileItem.write(new File("指定目录"))
//删除临时文件
fileItem.delete()
//文件流
InputStream in = fileItem.getInputStream();
//文件的大小
long size = fileItem.getSize();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("不是文件上传表单");
}