javaweb工程 servlet文件上传与下载

javaweb servlet文件上传

文件上传需要的两个jar包
http://download.csdn.net/download/weixin_39549656/10162931

文件上传servlet

UploadHandleServlet.java

import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 import java.util.UUID;

 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.FileUploadBase;
 import org.apache.commons.fileupload.ProgressListener;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;

 /**
 * @ClassName: UploadHandleServlet
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @date: 2015-1-3 下午11:35:50
 *
 */ 
 public class UploadHandleServlet extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
         //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
         String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
         //上传时生成的临时文件保存目录
         String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
         System.out.println(tempPath);
         File tmpFile = new File(tempPath);
         if (!tmpFile.exists()) {
           //创建临时目录
           tmpFile.mkdir();
         }

         //消息提示
         String message = "";
         try{
           //使用Apache文件上传组件处理文件上传步骤:
           //1、创建一个DiskFileItemFactory工厂
           DiskFileItemFactory factory = new DiskFileItemFactory();
           //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
           factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
           //设置上传时生成的临时文件的保存目录
           factory.setRepository(tmpFile);
           //2、创建一个文件上传解析器
           ServletFileUpload upload = new ServletFileUpload(factory);
           //监听文件上传进度
           upload.setProgressListener(new ProgressListener(){
             public void update(long pBytesRead, long pContentLength, int arg2) {
               System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
               /**
                * 文件大小为:14608,当前已处理:4096
                 文件大小为:14608,当前已处理:7367
                 文件大小为:14608,当前已处理:11419
                 文件大小为:14608,当前已处理:14608
                */
             }
           });
            //解决上传文件名的中文乱码
           upload.setHeaderEncoding("UTF-8"); 
           //3、判断提交上来的数据是否是上传表单的数据
           if(!ServletFileUpload.isMultipartContent(request)){
             //按照传统方式获取数据
             return;
           }

           //设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
           upload.setFileSizeMax(1024*1024);
           //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
           upload.setSizeMax(1024*1024*10);
           //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
           List<FileItem> list = upload.parseRequest(request);
           for(FileItem item : list){
             //如果fileitem中封装的是普通输入项的数据
             if(item.isFormField()){
               String name = item.getFieldName();
               //解决普通输入项的数据的中文乱码问题
               String value = item.getString("UTF-8");
               //value = new String(value.getBytes("iso8859-1"),"UTF-8");
               System.out.println(name + "=" + value);
             }else{//如果fileitem中封装的是上传文件
               //得到上传的文件名称,
               String filename = item.getName();
               System.out.println(filename);
               if(filename==null || filename.trim().equals("")){
                 continue;
               }
               //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
               //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
               filename = filename.substring(filename.lastIndexOf("\\")+1);
               //得到上传文件的扩展名
               String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
               //如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
               System.out.println("上传的文件的扩展名是:"+fileExtName);
               //获取item中的上传文件的输入流
               InputStream in = item.getInputStream();
               //得到文件保存的名称
               String saveFilename = makeFileName(filename);
               //得到文件的保存目录
               String realSavePath = makePath(saveFilename, savePath);
               System.out.println("这是保存的路径"+realSavePath);
               //创建一个文件输出流
               FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
              //创建一个缓冲区
               byte buffer[] = new byte[1024];
               //判断输入流中的数据是否已经读完的标识              
               int len = 0;
               //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
               while((len=in.read(buffer))>0){
                 //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
                 out.write(buffer, 0, len);
               }
               //关闭输入流
               in.close();
               //关闭输出流
               out.close();               //删除处理文件上传时生成的临时文件               //item.delete();               message = "文件上传成功!";
             }
           }
         }catch (FileUploadBase.FileSizeLimitExceededException e) {
           e.printStackTrace();
           request.setAttribute("message", "单个文件超出最大值!!!");
           request.getRequestDispatcher("/message.jsp").forward(request, response);
           return;
         }catch (FileUploadBase.SizeLimitExceededException e) {
           e.printStackTrace();
           request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");
           request.getRequestDispatcher("/message.jsp").forward(request, response);
           return;
         }catch (Exception e) {
           message= "文件上传失败!";
           e.printStackTrace();
         }
         request.setAttribute("message",message);
         request.getRequestDispatcher("/message.jsp").forward(request, response);
   }

   /**
   * @Method: makeFileName
   * @Description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
   * @param filename 文件的原始名称
   * @return uuid+"_"+文件的原始名称
   */ 
   private String makeFileName(String filename){ //2.jpg
     //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
     return UUID.randomUUID().toString() + "_" + filename;
   }   
   /**
   * 为防止一个目录下面出现太多文件,要使用hash算法打散存储
   * @Method: makePath
   * @Description: 
   *
   * @param filename 文件名,要根据文件名生成存储目录
   * @param savePath 文件存储路径
   * @return 新的存储目录
   */ 
  private String makePath(String filename,String savePath){
     //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
     int hashcode = filename.hashCode();
     int dir1 = hashcode&0xf; //0--15
     int dir2 = (hashcode&0xf0)>>4; //0-15
     //构造新的保存目录
     String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
     //File既可以代表文件也可以代表目录    
     File file = new File(dir);
    //如果目录不存在
     if(!file.exists()){
       //创建目录
       file.mkdirs();
    }
     return dir;
   }

   public void doPost(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {

     doGet(request, response);
   }
 }

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <servlet-name>CCDUpload</servlet-name>
        <servlet-class>CCDUpload</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CCDUpload</servlet-name>
        <url-pattern>/UploadHandleServlet</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>upload.jsp</welcome-file>
    </welcome-file-list>
</web-app>

upload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%request.setAttribute("webPath", request.getContextPath());%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
   <title>文件上传</title>
  </head>

  <body>
   <form action="${pageContext.request.contextPath}/UploadHandleServlet" enctype="multipart/form-data" method="post">
     上传用户:<input type="text" name="username"><br/>
     上传文件1:<input type="file" name="file1"><br/>
     上传文件2:<input type="file" name="file2"><br/>
     <input type="submit" value="提交">
   </form>
  </body>
 </html>

message.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%request.setAttribute("webPath", request.getContextPath());%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
  <head>
   <title>消息提示</title>
  </head>

  <body>
     ${message}
  </body>
 </html>



javaweb servlet文件下载

upload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%request.setAttribute("webPath", request.getContextPath());%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>下载页面</title>
</head>
<body >
<h1>下载文件</h1>  
<a href="${webPath}/down">压缩包</a>  
</body>
</html>
public class DownAction  implements ServletContextAware{


    private ServletContext servletContext; 

     @RequestMapping("file")  
     public void fileDownload(HttpServletResponse response){  
         //获取网站部署路径(通过ServletContext对象),用于确定下载文件位置,从而实现下载  
         String path = servletContext.getRealPath("/");  

         System.out.println(path);
         //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型  
         response.setContentType("multipart/form-data");  
         //2.设置文件头:最后一个参数是设置下载文件名(假如我们叫a.pdf)  
         response.setHeader("Content-Disposition", "attachment;fileName="+"a.pdf");  
         ServletOutputStream out;  
         //通过文件路径获得File对象(假如此路径中有一个download.pdf文件)  
         response.setHeader("content-type", "text/html;charset=UTF-8");
         File file = new File("D:\\a.pdf");  

         try {  
             FileInputStream inputStream = new FileInputStream(file);  
             //3.通过response获取ServletOutputStream对象(out)  
             out = response.getOutputStream();  

             int b = 0;  
             byte[] buffer = new byte[512];  
             while (b != -1){  
                 b = inputStream.read(buffer);  
                 //4.写到输出流(out)中  
                 out.write(buffer,0,b);  
             }  
             inputStream.close();  
             out.close();  
             out.flush();  

         } catch (IOException e) {  
             e.printStackTrace();  
         }  
     }  


     @Override  
     public void setServletContext(ServletContext servletContext) {  
         this.servletContext = servletContext;  
     }  
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值