使用JSP/Servlet简单实现文件上传与下载

jsp上传页面代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>文件上传</title> 
     
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0"> 
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    --> 
 
  </head> 
   
  <body> 
    <form action="${pageContext.request.contextPath}/servlet/UploadServlet" method="post" enctype="multipart/form-data"> 
        name:<input name="name"/><br/> 
        file1:<input type="file" name="f1"/><br/> 
         
        <input type="submit" value="上传"> 
    </form> 
  </body> 
</html>

上传servlet:

public class UploadServlet extends HttpServlet { 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        request.setCharacterEncoding("UTF-8"); 
        response.setContentType("text/html;charset=UTF-8"); 
        PrintWriter out = response.getWriter(); 
        System.out.print(request.getRemoteAddr()); 
        boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
        if(!isMultipart){ 
            throw new RuntimeException("请检查您的表单的enctype属性,确定是multipart/form-data"); 
        } 
        DiskFileItemFactory dfif = new DiskFileItemFactory(); 
        ServletFileUpload parser = new ServletFileUpload(dfif); 
         
        parser.setFileSizeMax(3*1024*1024);//设置单个文件上传的大小 
        parser.setSizeMax(6*1024*1024);//多文件上传时总大小限制 
         
        List<FileItem> items = null; 
        try { 
            items = parser.parseRequest(request); 
        }catch(FileUploadBase.FileSizeLimitExceededException e) { 
            out.write("上传文件超出了3M"); 
            return; 
        }catch(FileUploadBase.SizeLimitExceededException e){ 
            out.write("总文件超出了6M"); 
            return; 
        }catch (FileUploadException e) { 
            e.printStackTrace(); 
            throw new RuntimeException("解析上传内容失败,请重新试一下"); 
        } 
         
        //处理请求内容 
        if(items!=null){ 
            for(FileItem item:items){ 
                if(item.isFormField()){
processFormField(item);
}else{ 
                    processUploadField(item); 
                } 
            } 
        } 
         
        out.write("上传成功!"); 
    } 
    private void processUploadField(FileItem item) { 
        try { 
            String fileName = item.getName(); 
             
             
            //用户没有选择上传文件时 
            if(fileName!=null&&!fileName.equals("")){ 
                fileName = UUID.randomUUID().toString()+"_"+FilenameUtils.getName(fileName); 
                 
                //扩展名 
                String extension = FilenameUtils.getExtension(fileName); 
                //MIME类型 
                String contentType = item.getContentType(); 
                 
                 
                 
                //分目录存储:日期解决 
    //          Date now = new Date(); 
    //          DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
    //           
    //          String childDirectory  = df.format(now); 
                 
                 
                //按照文件名的hashCode计算存储目录 
                String childDirectory = makeChildDirectory(getServletContext().getRealPath("/WEB-INF/files/"),fileName); 
                 
                String storeDirectoryPath = getServletContext().getRealPath("/WEB-INF/files/"+childDirectory); 
                File storeDirectory = new File(storeDirectoryPath); 
                if(!storeDirectory.exists()){ 
                    storeDirectory.mkdirs(); 
                } 
                System.out.println(fileName); 
                item.write(new File(storeDirectoryPath+File.separator+fileName));//删除临时文件 
                 
            } 
        } catch (Exception e) { 
            throw new RuntimeException("上传失败,请重试"); 
        } 
         
    } 
    //计算存放的子目录 
    private String makeChildDirectory(String realPath, String fileName) { 
        int hashCode = fileName.hashCode(); 
        int dir1 = hashCode&0xf;// 取1~4位 
        int dir2 = (hashCode&0xf0)>>4;//取5~8位 
         
        String directory = ""+dir1+File.separator+dir2; 
        File file = new File(realPath,directory); 
        if(!file.exists()) 
            file.mkdirs(); 
         
        return directory; 
    } 
    private void processFormField(FileItem item) { 
        String fieldName = item.getFieldName();//字段名 
        String fieldValue; 
        try { 
            fieldValue = item.getString("UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
            throw new RuntimeException("不支持UTF-8编码"); 
        } 
        System.out.println(fieldName+"="+fieldValue); 
    } 
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        doGet(request, response); 
    } 
 
}

显示所有文件的servlet:

public class ShowAllFilesServlet extends HttpServlet { 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        String storeDirectory = getServletContext().getRealPath("/WEB-INF/files"); 
        File root = new File(storeDirectory); 
         
        //用Map保存递归的文件名:key:UUID文件名   value:老文件名 
        Map<String, String> map = new HashMap<String, String>(); 
        treeWalk(root,map); 
         
        request.setAttribute("map", map); 
        request.getRequestDispatcher("/listFiles.jsp").forward(request, response); 
    } 
    //递归,把文件名放到Map中 
    private void treeWalk(File root, Map<String, String> map) { 
        if(root.isFile()){ 
            String fileName = root.getName();//文件名      
            String oldFileName = fileName.substring(fileName.indexOf("_")+1); 
            map.put(fileName, oldFileName); 
        }else{ 
            File fs[] = root.listFiles(); 
            for(File file:fs){ 
                treeWalk(file, map); 
            } 
        } 
         
    } 
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        doGet(request, response); 
    } 
 
}

显示所有文件的jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>title</title> 
     
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 
 
  </head> 
   
  <body> 
    <h1>以下资源可供下载</h1> 
    <c:forEach items="${map}" var="me"> 
        <c:url value="/servlet/DownloadServlet" var="url"> 
            <c:param name="filename" value="${me.key}"></c:param> 
        </c:url> 
        ${me.value}  <a href="${url}">下载</a><br/> 
    </c:forEach> 
  </body> 
</html>

下载文件的servlet:

public class DownloadServlet extends HttpServlet { 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        String uuidfilename = request.getParameter("filename");//get方式提交的 
        uuidfilename = new String(uuidfilename.getBytes("ISO-8859-1"),"UTF-8");//UUID的文件名 
         
        String storeDirectory = getServletContext().getRealPath("/WEB-INF/files"); 
        //得到存放的子目录 
        String childDirecotry = makeChildDirectory(storeDirectory, uuidfilename); 
         
        //构建输入流 
        InputStream in = new FileInputStream(storeDirectory+File.separator+childDirecotry+File.separator+uuidfilename); 
        //下载 
String oldfilename = uuidfilename.substring(uuidfilename.indexOf("_")+1); 
        //通知客户端以下载的方式打开 
        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(oldfilename, "UTF-8")); 
         
        OutputStream out = response.getOutputStream(); 
         
        int len = -1; 
        byte b[] = new byte[1024]; 
        while((len=in.read(b))!=-1){ 
            out.write(b,0,len); 
        } 
        in.close(); 
        out.close(); 
         
    } 
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        doGet(request, response); 
    } 
    //计算存放的子目录 
    private String makeChildDirectory(String realPath, String fileName) { 
        int hashCode = fileName.hashCode(); 
        int dir1 = hashCode&0xf;// 取1~4位 
        int dir2 = (hashCode&0xf0)>>4;//取5~8位 
         
        String directory = ""+dir1+File.separator+dir2; 
        File file = new File(realPath,directory); 
        if(!file.exists()) 
            file.mkdirs(); 
         
        return directory; 
    } 
}

转载:http://www.cnblogs.com/ys-wuhan/p/5772426.html

jsp/servlet实现简单上传和下载的更多相关文章

  1. Jsp/Servlet文件的上传和下载

    文件上传的入门 文件上传的步骤:       总结实现思路: 1.创建核心上传类ServletFileUpload,这个时候需要一个工厂类 2.创建磁盘工厂类对象DiskFileItemFactory ...

  2. jsp+servlet实现文件上传下载

    相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  3. secureCRT简单上传、下载文件记录

    secureCRT简单上传.下载文件记录: 1)sz下载 -y 覆盖 2)rz上传 -y 覆盖 3)以上两个命令属于安装时包含在“Dial-up Networking Support"组中 ...

  4. JSP实现大文件上传和下载

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...

  5. Servlet实现文件上传和下载

    对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具commo ...

  6. JSP中文件的上传于下载演示样例

    一.文件上传的原理     1.文件上传的前提:         a.form表单的method必须是post         b.form表单的enctype必须是multipart/form-da ...

  7. .Net简单上传与下载

    上传: 首先上传我们需要一个控件-FileUpLoad: 再加上一个上传按钮: 在上传按钮的Click事件中添加如下代码: FileUpload1.SaveAs(Server.MapPath(&quo ...

  8. 通过JSP+servlet实现文件上传功能

    在TCP/IP中,最早出现的文件上传机制是FTP.它将文件由客户端到服务器的标准机制. 但是在JSP中不能使用FTP来上传文件,这是有JSP的运行机制所决定的. 通过为表单元素设置Method=&qu ...

  9. jsp+servlet实现文件上传

    上传(上传不能使用BaseServlet) 1. 上传对表单限制 * method="post" * enctype="multipart/form-data" ...

随机推荐

  1. iOS 面试集锦

    是第一篇: 1.Difference between shallow copy and deep copy?
浅复制和深复制的区别?
答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身.
深层 ...

  2. 两种常见JS面向象写法

    基于构造函数 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circle.prototype.area = function() { ...

  3. docker的网络(进阶)

    overlay网络 overlay网络驱动程序会在多个docker守护程序(即多个主机上的docker守护程序)之间创建分布式网络.该网络(overlays)位于特定于主机的网络之上,允许连接到它的容 ...

  4. PHP操作MySQL事务实例

    PHP与MYSQL事务处理 一般来说,事务都应该具备ACID特征.所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字 ...

  5. 使用dmidecode在Linux下获取硬件信息

    dmidecode命令可以让你在Linux系统下获取有关硬件方面的信息.dmidecode的作用是将DMI数据库中的信息解码,以可读的文本方式显示.由于DMI信息可以人为修改,因此里面的信息不一定是系 ...

  6. shell-code-5-流程控制

    ××××××××××××××××××××IF-ELSE×××××××××××××××××××××××××××××× a=1b=2if [ $a == $b ]then echo a等于belif [ ...

  7. 基础训练 FJ的字符串

    FJ的字符串 #include<iostream> #include<string.h> using namespace std; int main(){ string str ...

  8. 03007_HttpServlet

    1.创建 new---Servlet package com.gzdlh.servlet; import java.io.IOException; import javax.servlet.Servl ...

  9. JavaScript 逗号操作符

    让我们从一个有趣的微博开始吧. 末尾的c是优先级最低的逗号操作符.逗号操作符是操作符优先级的最后一行,并且很少有文章记录,它隐藏着它的锋芒.它可能不是JavaScript强势操作符,但是我喜欢它.它简 ...

  10. 自定义iOS上双击Home键图切换

    如果双击Home,会来到iOS App的switcher页面,在这儿列出了当前系统挂起的App, 上面有每个App的切屏,相信大家都熟悉这个东东了.它其实是每个App在挂起前,对App后个载屏. 那么 ...