package com.rlovep.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileItemFactory;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext;
/**
* Servlet implementation class UpAndDown
*/
@WebServlet("/UpAndDown")
public class UpAndDown extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method=request.getParameter("method");
if("upload".equals(method))
{
upload(request, response);
}else if("downList".equals(method))
{
downList(request, response);
}
else if("down".equals(method)){
download(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
/**
* 文件上传
* @author peace
*/
private void upload(HttpServletRequest request,HttpServletResponse response){
//文件上传工厂
FileItemFactory factory=new DiskFileItemFactory();
//创建上传核心工具类
ServletFileUpload upload=new ServletFileUpload(factory);
//设置单个文件允许的大小:50M
upload.setFileSizeMax(50*1024*1024);
//设置文件上传表单允许的总大小:100M
upload.setSizeMax(100*1024*1024);
//设置上传表单文件名的编码:
upload.setHeaderEncoding("utf-8");
//文件名前缀
String prix=null;
/*
* 文件核心处理逻辑
*/
//判断当前表单是否为文件上传表单
if(ServletFileUpload.isMultipartContent(request))
{
try {
//把请求数据转换为一个个FileItem对象存入List
List<FileItem> list = upload.parseRequest(new ServletRequestContext(request));
for(FileItem item :list){
//判断是否为普通文本数据
if(item.isFormField())
{
// 普通文本数据
String fieldName = item.getFieldName(); // 表单元素名称
prix = item.getString(); // 表单元素名称,应的数据
//item.getString("UTF-8"); 指定编码
System.out.println(fieldName + " " + prix);
}
//上传文件
else{
// 普通文本数据
String fieldName = item.getFieldName(); // 表单元素名称
String name = item.getName(); // 文件名
String content = item.getString(); // 文件内容;这个不建议使用;
//String type = item.getContentType(); // 文件类型
//InputStream in = item.getInputStream();// 上传文件流
System.out.println(fieldName+"名字:"+name+"content"+content);
//组装文件名
name=prix+name;
//获取存放路径
String path=getServletContext().getRealPath("/upload");
System.out.println(path);
//创建目标文件
File file=new File(path,name);
//工具类,文件上传
item.write(file);
item.delete();//删除垃圾文件;
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void download(HttpServletRequest request,HttpServletResponse response)
throws IOException{
//获取用户下载的文件名称(url地址追加数据,get)
String fileName=request.getParameter("fileName");
//对编码转换
fileName=new String(fileName.getBytes("ISO8859-1"), "utf-8");
//获取文件下载路径
String path=getServletContext().getRealPath("/upload");
//获取一个文件流
InputStream in=new FileInputStream(new File(path,fileName));
//文件名是中文,需要进行url编码
fileName=URLEncoder.encode(fileName, "utf-8");
//设置下载响应头
response.setHeader("content-disposition", "attachment;fileName="+fileName);
//获取response字节流
OutputStream out = response.getOutputStream();
byte[] b=new byte[1024];
int len=-1;
while((len=in.read(b))!=-1)
{
//输出文件流
out.write(b,0,len);
}
out.close();
in.close();
}
private void downList(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException{
//获取文件名
String path=getServletContext().getRealPath("/upload");
File file=new File(path);
//获取所有文件
String[] list = file.list();
//将文件名保存到域中
request.setAttribute("fileNames", list);
//转发
request.getRequestDispatcher("/downlist.jsp").forward(request, response);
}
}