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


文件上传原理

在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
 
 

文件上传原理

在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地址:

猜你喜欢

转载自blog.csdn.net/qq_25560423/article/details/73469922
今日推荐