文件上传
一.前提
1.提供form表单,且method=”post”
2.form表单属性:enctype为multipart/form-data
3.<input type="file"/>
上传文件
二.Servlet操作
1.创建工厂类
2.使用工厂解析器对象
3.使用解析器解析request对象
4.获取表单并分类处理
三.代码
doGet代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//判断是否支持上传文件
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
//创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File("e:\\"));//临时文件的保存目录
//创建解析器对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//解析request对象
try {
//限制上传文件不大于3M
fileUpload.setFileSizeMax(1024*1024*3);
//解决乱码,设置编码格式
fileUpload.setHeaderEncoding("UTF-8");
//获取表单项集合
List<FileItem> list = fileUpload.parseRequest(request);
if(list.isEmpty()){
//表单为空
throw new RuntimeException("上传为空");
}
//分类为普通表单和上传表单
for (FileItem item : list) {
if (item.isFormField()) {
//普通表单
ProcessFormItem(item);
} else {
//上传表单
ProcessUploadItem(item);
}
}
}catch (FileUploadBase.SizeLimitExceededException e){
throw new RuntimeException("文件过大,不能超过3M");
}catch (FileUploadException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
}
目录按日期打散函数
private String makeChildDirectory(File storeDirector) {
//按照日期来创建子目录
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
String date = sdf.format(new Date());//将目前的日期转换为对应的字符串
File file = new File(storeDirector,date);//在传入参数的目录下创建子目录
if(!file.exists()){
file.mkdir();//若文件不存在则创建一个
}
return date;
}
上传表单处理函数
private void ProcessUploadItem(FileItem item) throws IOException {
/*1.获取到解析后的输入流
2.建立输入流和服务器储存资源位置
3.IO*/
//得到上传的名字
String fileName = item.getName();
if(fileName!=null){
//解决文件带路径的问题
fileName= FilenameUtils.getName(fileName);
}
if(fileName!=null){
//解决文件重名的问题,随机数加下划线加名字
fileName= UUID.randomUUID()+"_"+fileName;
}
//获取输入流
InputStream inputStream=item.getInputStream();
//得到存资源的路径
String directRealPath = this.getServletContext().getRealPath("/upload");
//由路径来打开文件夹
File storeDirector =new File(directRealPath);
//若文件夹不存在就建立一个
if (!storeDirector.exists()){
storeDirector.mkdir();
}
//避免所有的上传都在一个文件里面,需要打散目录
String childDirectory = makeChildDirectory(storeDirector);
//在当日对应文件夹中建立对应文件
File file=new File(storeDirector,childDirectory+File.separator+fileName);
//建立输出流
FileOutputStream outputStream=new FileOutputStream(file);
//IO
int len=0;
byte[] b=new byte[1024];
while((len= inputStream.read(b))!=-1){
outputStream.write(b,0,len);
}
//关闭输入输出
outputStream.close();
inputStream.close();
item.delete();//删除临时文件
}
普通表单处理
private void ProcessFormItem(FileItem item){
String filedName = item.getFieldName();//获取字段名
String filedValue=null;
try {
filedValue = item.getString("UTF-8");//获取字段值
filedName=new String(filedName.getBytes("iso-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(filedName+"="+filedValue);
}
文件下载
doGet代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置一个要下载的文件
String filename="班级账单.csv";
//设置文件的编码
if(request.getHeader("user-agent").toLowerCase().contains("msie")){
//讲不安全的文件名改为UTF-8格式
filename= URLEncoder.encode(filename,"UTF-8");
}else{
//火狐浏览器
filename=new String(filename.getBytes("UTF-8"),"iso-8859-1");
}
//告诉浏览器要下载文件
response.setHeader("content-disposition","attachment;filename="+filename);
//根据文件名自动获得文件类型
response.setContentType(this.getServletContext().getMimeType(filename));
//告诉服务器用什么编码
response.setCharacterEncoding("UTF-8");
//创建一个文件输入流
PrintWriter out=response.getWriter();
out.write("团组织活动,100\n");
out.write("聚餐,2000\n");
out.write("练习册,400\n");
}