一、文件上传
1、实现文件上传需要使用Apache的组件,添加 commons-fileupload-1.4.jar 和 commons-io.2.6.jar 两个jar包到web项目中。jar包可以在Apache官网下载。
2、实现文件上传使用到的两个主要类:
DiskFileItemFactory(item工厂) 、 ServletFileUpload(上传文件解析器)
主要的方法可以查看相关链接:https://www.cnblogs.com/liuyangv/p/8282437.html
3、代码:
public class UpLoadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得得到用来保存上传文件的路径,可以放在WEB-INF下
String savePath=req.getServletContext().getRealPath("WEB-INF"+ File.separator+"save");
//临时目录:保存上传的过程中生成的临时文件
String tempPath=req.getServletContext().getRealPath("WEB-INF"+File.separator+"temp");
File file=new File(tempPath);
//如果路径不存在就创建
if(!file.exists()){
file.mkdir();
System.out.println("创建临时目录:"+tempPath);
}
//1、获取DiskFileItemFactory对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置工厂的缓冲区大小,当上传的文件超过了缓冲区的大小时,就会生成一个临时文件存放在指定临时目录下
factory.setSizeThreshold(1024*100);
factory.setRepository(file); //指定临时目录
//2、获取上传文件解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//设置文件上传监听器
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long l, long l1, int i) {
System.out.println("文件上传进度为:"+(l*100/l1)+"%");
}
});
//判断表单的enctype属性是否是multipart/form-data,也就是判度是否是一个文件上传表单
if(!ServletFileUpload.isMultipartContent(req)){
return; //不是上传表单则直接退出
}
try{
List<FileItem> list = upload.parseRequest(req);
for(FileItem item:list){
//判断item封装的是一个普通文本字段,还是文件表单字段
if(item.isFormField()){
String name=item.getName(); //获取字段名
String value=item.getString("UTF-8"); //获取字段内容
System.out.println("上传的普通文本字段:"+name+"="+value);
}
else{
String name=item.getName(); //得到上传的文件名
//判断文件名是否为空,或者等于""
if(name==null || name.trim().equals(""))
continue;
//不同的浏览器上传文件的文件名是不一样的,如:IE上传的是路径,Firefox上传的是文件名
String realName=name.substring(name.lastIndexOf(File.separator)+1); //通过最后一个
InputStream in=item.getInputStream(); //获取上传文件的输入流
OutputStream out=new FileOutputStream(new File(savePath+File.separator+realName)); //获取保存文件的输出流
byte[] buffer=new byte[1024];
int length=0;
while((length=in.read())!=-1){
out.write(buffer,0,length);
}
in.close();
out.close();
item.delete(); //处理上传过程中产生的临时文件
}
}
}catch(FileUploadException e){}
System.out.println("文件上传成功!");
}
}
注意:用于上传的表单应该设置enctype属性为:multipart/form-data ,且 应该为 post方式
<form action="upload" enctype="multipart/form-data" method="post">
<input type="file" />
</form>
二、文件的下载
1、文件下载一般过程是:点击下载——>列出所有可以下载的文件(有一个可以列出所有可以下载的文件的servlet)——>在点击相应文件进行下载(有一个用于下载的servlet)
2、代码(还待修整)
public class DownLoad extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取文件保存的路径
String path=req.getServletContext().getRealPath("WEB-INF/save/")+req.getParameter("s");
//获取下载文件要存放的位置
String save="/home/luoyuan/save/3.jpg";
File file=new File(path);
if(!file.exists()){
System.out.println("文件不存在!");
}
FileInputStream in=new FileInputStream(file);
FileOutputStream out=new FileOutputStream(new File(save));
byte[] buffer=new byte[1024];
int length=0;
while((length=in.read(buffer))!=-1){
out.write(buffer,0,length);
}
in.close();
out.close();
}
}
public class ListFileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取文件保存的路径
String path=req.getServletContext().getRealPath("WEB-INF/save");
System.out.println(path);
File file=new File(path);
//用来保存路径下的所有文件名
List<String> list=new ArrayList<>();
list=listFile(file,list);
req.setAttribute("fileList",list);
System.out.println("转发至下载页面");
req.getRequestDispatcher("/download.jsp").forward(req,resp);
}
public List<String> listFile(File file, List<String> list){
String name=file.getName();
System.out.println(name);
if(file.isDirectory()){ //如果该file对象是个目录,则列出该目录下的所有文件,然后递归
File[] arr=file.listFiles();
for (File f:arr)
listFile(f,list);
}
else
list.add(name);
return list;
}
}