Java+jsp+Servlet实现文件上传和下载

来源:互联网 发布:计算软件有哪些 编辑:程序博客网 时间:2024/06/06 00:03

文件的上传和下载---学习笔记

502人阅读 评论(0)收藏举报
本文章已收录于:
分类:
作者同类文章X

    目录(?)[+]

    1. 文件上传原理
    2. 文件下载原理
    3. 使用SmartUpload实现文件的上传和下载

    文件上传原理

    在TCP/IP中,最早出现的文件上传机制是FTP。它是将文件由客户端发送到服务器的标准机制。
    但是JSP编程中不能使用FTP方法来上传文件,这是由JSP运行机制所决定的。

    JSP中上传文件的解决方式:
    通过为表单元素设置
    Method = “post”
    enctype = “multipart/form-data”
    属性,让表单提交的数据以二进制编码的方式提交,在接受此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。

    表单中enctype属性说明:
    enctype属性的值有三种:

    • application/x-www-form=urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
    • multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
    • text/plain:这种方式主要适用于直接通过表单发送邮件的方式

    文件上传的实现步骤:

    1. 环境搭建:配置web.xml创建UploadServlet
    2. 前台页面配置:Form的method设置为post,enctype设置为multipart/form-data
    3. 后台Servlet实现:保存上传文件

    上传文件的后台实现的具体步骤:

    1. 获取request当中的流信息,保存到临时文件
    2. 从临时文件当中得到上传的文件名及文件内容起止位置
    3. 根据文件起止位置,读取上传文件内容,保存到本地

    文件的上传:

    //文件上传    private void uploadFile(HttpServletRequest request, HttpServletResponse response)            throws IOException, FileNotFoundException, ServletException {        // 从request当中获取流信息        InputStream is = request.getInputStream();        // 在本地创建临时文件        String tempFileName = "C:\\Users\\Administrator\\Desktop\\tempFile";        File tempFile = new File(tempFileName);        // 将request请求中的所有信息写入临时文件中        FileOutputStream fos = new FileOutputStream(tempFile);        byte[] b = new byte[1024];        int n;        while ((n = is.read(b)) != -1) {            fos.write(b, 0, n);        }        fos.close();        is.close();        // 获取临时文件中的上传文件的文件名        RandomAccessFile randomFile = new RandomAccessFile(tempFile, "r");        randomFile.readLine();// 读取第一行数据        String str = randomFile.readLine();// 读取第二行的内容        int beginIndex = str.lastIndexOf("\\") + 1;        System.out.println("开始位置:"+beginIndex);        int endIndex = str.lastIndexOf("\"");        String filename = str.substring(beginIndex, endIndex);        System.out.println("文件名:"+filename);        //获取文件内容的开始位置        randomFile.seek(0);//重新将定位文件指针定位到文件头        long startPosition = 0;        int i = 1;        while((n = randomFile.readByte())!=-1&&i<=4){            if(n=='\n'){                startPosition = randomFile.getFilePointer();                i++;            }        }        startPosition = randomFile.getFilePointer()-1;        //获取文件内容的结束位置        randomFile.seek(randomFile.length());//定义文件指针到文件结尾        long endPosition = randomFile.getFilePointer();        int j = 1;        while(endPosition>=0&&j<=2){            endPosition--;            randomFile.seek(endPosition);            if(randomFile.readByte()=='\n'){                j++;            }        }        endPosition = endPosition-1;        //设置保存上传文件的路径        String realPath = getServletContext().getRealPath("/")+"images";        System.out.println("上传文件的路径:"+realPath);        File fileupload = new File(realPath);        if(!fileupload.exists()){            fileupload.mkdir();        }        File saveFile = new File(realPath,filename);        RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile, "rw");        //从临时文件当中读取文件内容(根据起止位置获取)        randomFile.seek(startPosition);        while(startPosition<endPosition){            randomAccessFile.write(randomFile.readByte());            startPosition = randomFile.getFilePointer();        }        //关闭输入输出流、删除临时文件        randomFile.close();        randomAccessFile.close();        tempFile.delete();        request.setAttribute("result", "上传成功!");        RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/01.jsp");        dispatcher.forward(request, response);    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    文件下载原理

    文件下载的步骤:

    1. 需要通过HttpServletResponse.setContentType方法设置Content-Type头字段的值,位浏览器无法使用某种方式或激活某个程序来处理的MIME类型,例如:“application/octet-stream”或“application/x-msdownload”等。
    2. 需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为“attachment;filename=”文件名””。
    3. 读取下载文件,调用HttpServletResponse.getOutputStream方法返回的ServletOutputStream对象来向客户端写入附件文件内容。

    实现步骤:

    1. 前台页面开发:通过超链接的方式发起文件下载请求
    2. 配置web.xml文件:配置web.xml,创建DownloadServlet
    3. 后台Servlet实现:设置响应类型及响应头输出流写入文件内容

    批量文件下载:

    // 批量下载文件    private void downMore(HttpServletRequest req, HttpServletResponse resp) throws IOException {        resp.setContentType("application/x-msdownload");        resp.setHeader("Content-Disposition", "attachment;filename=test.zip");        String path = getServletContext().getRealPath("/") + "images/";        String[] filenames = req.getParameterValues("filename");        String str = "";        String rt = "/r/n";        ZipOutputStream zos = new ZipOutputStream(resp.getOutputStream());        for (String filename : filenames) {            str += filename + rt;            File file = new File(path+filename);            zos.putNextEntry(new ZipEntry(filename));            FileInputStream fis = new FileInputStream(file);            byte[] b = new byte[1024];            int n = 0;            while ((n = fis.read(b)) != -1) {                zos.write(b, 0, n);            }            zos.flush();            fis.close();        }        zos.setComment("download success:" + rt + str);        zos.flush();        zos.close();    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    单文件下载:

    // 下载一个文件    private void downOne(HttpServletRequest request, HttpServletResponse response)            throws FileNotFoundException, IOException, ServletException {        // 获取文件下载路径        String path = getServletContext().getRealPath("/") + "images/";        System.out.println("要下载的文件路径地址:" + path);        String filename = request.getParameter("filename");        File file = new File(path + filename);        if (file.exists()) {            // 设置响应类型            response.setContentType("application/x-msdownload");            // 设置头信息(作用:以附件的形式打开我们的下载文件,并且指定了附件的名称,这样下载的时候文件名就是这里设置的文件名称了)            response.setHeader("Content-Dispostion", "attachment;filename=\"" + filename + "\"");            InputStream is = new FileInputStream(file);            ServletOutputStream sos = response.getOutputStream();            byte[] b = new byte[1024];            int n;            while ((n = is.read(b)) != -1) {                sos.write(b, 0, n);            }            // 关闭流释放资源            sos.close();            is.close();        } else {            request.setAttribute("errorResult", "文件不存在,下载失败!");            RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/01.jsp");            dispatcher.forward(request, response);        }    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    使用SmartUpload实现文件的上传和下载

    1.使用该组件可以轻松的实现上传文件类型的限制,也可以轻易的取得文件上传的名称、后缀、大小等。
    2.SmartUpload本身也是一个系统提供的jar包,直接将此包放到classpath下即可,也可以拷贝到tomcat_home\lib目录中

    使用SmartUpload实现文件的批量上传:

    private void uploadFiles(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //设置上传文件保存路径        String filePath = getServletContext().getRealPath("/")+"images";        System.out.println("上传到的文件路径地址:"+filePath);        File file = new File(filePath);        if(!file.exists()){            file.mkdir();        }        String result = "上传成功!";        SmartUpload su = new SmartUpload();        //初始化对象        su.initialize(getServletConfig(), request, response);        //设置上传文件的大小(10M)        su.setMaxFileSize(1024*1024*10);        //设置上传的所有文件的大小(100M)        su.setTotalMaxFileSize(1024*1024*100);        //设置上传文件的的类型        su.setAllowedFilesList("txt,jpg,gif");        //设置禁止上传文件的类型        try {            su.setDeniedFilesList("rar,jsp,js");            //上传文件            su.upload();            //将上传文件保存在文件夹中(返回的是上传的文件的个数)            int count = su.save(filePath);            System.out.println("上传成功了"+count+"个文件!");        } catch (Exception e) {            result = "上传失败!";            if(e.getMessage().indexOf("1015")!=-1){                result = "上传失败:上传文件类型不正确!";            }else if(e.getMessage().indexOf("1010")!=-1){                result = "上传失败:上传文件的类型不正确!";            }else if(e.getMessage().indexOf("1105")!=-1){                result = "上传失败:上传文件的大小大于允许上传的最大值!";            }else if(e.getMessage().indexOf("1110")!=-1){                result = "上传失败:上传文件的总大小大于允许上传的最大值!";            }            e.printStackTrace();        }         //通过SmartUpload获得上传文件的其他属性        for(int i=0;i<su.getFiles().getCount();i++){            org.lxh.smart.File tempFile = su.getFiles().getFile(i);            System.out.println("----------------------");            System.out.println("上传的文件名:"+tempFile.getFileName());            System.out.println("上传的文件的大小:"+tempFile.getSize());            System.out.println("上传的扩展名:"+tempFile.getFileExt());            System.out.println("上传的文件的全名:"+tempFile.getFilePathName());            System.out.println("----------------------");        }        request.setAttribute("result", result);        request.getRequestDispatcher("jsp/02.jsp").forward(request, response);    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    使用SmartUpload实现文件的下载(单文件下载):

    //下载一个文件    private void downOne(HttpServletRequest request, HttpServletResponse response) {        String filename = request.getParameter("filename");        SmartUpload su = new SmartUpload();        try {            su.initialize(getServletConfig(), request, response);            su.downloadFile("/images/" + filename);        } catch (Exception e) {            e.printStackTrace();        }    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    项目完整代码的Github地址:

    0
    0
     
     

      相关文章推荐
    • php学习笔记(十)文件的上传与下载
    • Struts2学习笔记(七)之文件的下载
    • Java web 中实现简单的文件上传与下载——学习笔记
    • ThinkPHP学习笔记(十四)上传文件
    • Struts2学习笔记13:Struts2的文件上传和下载
    • Struts2.x 学习笔记 之 文件上传和下载
    • MonoRail学习笔记十五:文件上传
    • hadoop学习笔记之hdfs的文件上传下载
    • OA (ssh) 基本实现(poi 生成 Excel , struts2动态下载 mysql数据库文件) 学习笔记(含源代码)
    • Flask--学习笔记--上传、下载文件
    原创粉丝点击