最早以前的文件上传就是进行拼接字符串。
步骤
[1]客户端要求
1)要有文件上传项
2)input type =file 还需要一个name属性
3)提交方式必须是post
4)enctype="multipart/form-data"
[2]实现文件上传市面常见的2种技术
1)jspsmartUpload
2)apache fileupload
[3]使用fileipload实现文件上传
enctype="multipart/form-data" 必须加才能获得请求体里面的内容上传到服务器 不写无法看到请求体里的内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="up" method="post" enctype="multipart/form-data" >
请输入用户名:<input type="text" name="name" /> </br>
请上传文件:<input type="file"name="file" /> </br>
<input type="submit" />
</form>
</body>
</html>
1)导包
2)构建一个磁盘文件工厂
3)通过工厂获取一个文件核心上传类
4)解析request 返回list<FileItem>
5)循环list 取出每个FileItem 判断是普通项 还是文件项
6)根据对应的类型处理主请求
package com.xiaoshuai;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
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;
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
try {
System.out.println("开始下载");
// [1]创建DiskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
// [2]创建一个解析请求的对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// [2.1]解决乱码
fileUpload.setHeaderEncoding("utf-8");
// [3]解析request对象
List<FileItem> list = fileUpload.parseRequest(request);
// [4]遍历这个集合
for (FileItem fileItem : list) {
if (fileItem.isFormField()) {
// 表单的普通字段
String key = fileItem.getFieldName();
String value = fileItem.getString();
System.out.println("key = " + key + " value=" + value);
} else {
// 文件内容
String fileName = fileItem.getName(); // 获取文件名字
// 文件的内容
InputStream inputStream = fileItem.getInputStream();
String realPath = getServletContext().getRealPath("upload");
System.out.println("realPath :" + realPath);
FileOutputStream fops = new FileOutputStream(realPath + "/" + fileName);
int len = 0;
byte[] buffer = new byte[1024];
while ((len = inputStream.read(buffer)) != -1) {
fops.write(buffer, 0, len);
}
fops.close();
inputStream.close();
System.out.println("下载成功");
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
}
}
文件上传的核心类:
DiskFileItemFactory 磁盘工厂
DiskFileItemFactory(int sizeThreshold, java.io.File repository)
参数1:上传文件的缓存
参数2:如果上传的文件超过了你设置的缓存,设置一个新的临时目录来存放
factory.setSizeThreshold(1024*1024);//1mb
factory.setRepository(new File(getServletContext().getRealPath("temp")));
ServletFileUpload 核心文件上传类
ServletFileUpload(FileItemFactory fileItemFactory)
参数:需要一个磁盘工厂
解决文件上传乱码:
fileUpload.setHeaderEncoding("utf-8");
FileItem 数据类型
fileItem.isFormField()
String fieldName = fileItem.getFieldName(); // 取出字段的名字
String string = fileItem.getString(); // 取出字段的值
else
String fieldName = fileItem.getFieldName(); // 取出字段的名字
String string = fileItem.getString(); // 取出文件的内容
String name = fileItem.getName(); // 取出字段的值 实际上是文件名
删除临时文件 如果有的话
fileItem.delete()