美文网首页
Web 基础26 文件上传概述及其入门案例

Web 基础26 文件上传概述及其入门案例

作者: 小熊先生很不开心 | 来源:发表于2018-04-05 13:48 被阅读11次

1.1 文件上传概述

  • 文件上传
    • 用户将本地文件通过网络上传至服务器的过程
  • 应用场景
    • 相亲网站的照片上传
    • 招聘网站的简历上传
  • 文件上传的技术
名称 描述
jspSmartUpload 应用在jsp上的文件上传和文件下载的组件
fileupload 应用在java上的文件上传技术,由Apache开源组织提供
servlet3.0 提供了文件上传的技术
Struts 提供了文件上传的技术
  • 文件上传的条件
    • 需要有一个表单
    • 表单的method属性的值必须设置为post
    • 表单的enctype属性的值需要设置为multipart/form-data
    • 表单需要有一个input标签
      • input标签type属性的值需要设置为file
      • input标签需要有name属性和值

1.2 JSP编写

  • 一些属性的注释
    • enctype:encode type 编码类型:属性规定了发送服务器之前如何对表单数据进行编码
    • application/x-www-form-urlencoded %WE%RT 默认对表单数据进行url编码,不能用于文件上传
    • multipart/form-data:表单数据有多个部分组成:既有文本数据,还有文件,图片这些二进制数据设置之后,浏览器会将文件以二进制的方式上传,可以实现多种类型的文
      件上传
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
    <h1>文件上传</h1>
    
    <form action="${pageContext.request.contextPath}/UploadServlet" method="post" enctype="multipart/form-data">
        文件信息:<input type="text" name="info"/>
        <br />
        用户名:<input type="text" name="username"/>
        <br />
        文件:<input type="file" name="file01" />
        <br />
        文件2:<input type="file" name="file02" />
        <br />
        <input type="submit" value="上传"/>
    </form>
</body>
</html>

1.3 Servlet的编写

  • 编写流程
    • 创建一个磁盘文件的工厂对象
    • 创建文件上传的核心对象
    • 通过核心对象解析请求对象得到一个集合对象,他里面包含所有的表单项对象
    • 遍历这个集合对象,得到每一个表单项,判断他是否是普通表单项
    • 如果是普通的表单项,获取他的name和value的值
    • 如果不是,创建IO流传输
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取表单所提交的数据
        //创建磁盘文件的工厂对象
        DiskFileItemFactory dfif = new DiskFileItemFactory();
        //创建文件上传的核心对象
        ServletFileUpload upload = new ServletFileUpload(dfif);
        //解析请求对象,获取表单所提交的数据
        List<FileItem> items = null;
        try {
            items = upload.parseRequest(request);
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //遍历集合对象
        if(items != null) {
            for (FileItem fileItem : items) {
                //判断表单项是否是普通的表单项
                if(fileItem.isFormField()) {
                    //确定是普通的表单项
                    //获取普通表单项name属性的值
                    String fieldName = fileItem.getFieldName();
                    //获取普通表单项value属性的值
                    String fieldValue = fileItem.getString("UTF-8");
                    System.out.println(fieldName + "=" + fieldValue);
                }
                else {
                    //文件上传的表单项
                    //获取文件名称
                    String fileName = fileItem.getName();
                    //获取文件的内容
                    InputStream is = fileItem.getInputStream();
                    /*byte[] bys = new byte[1024];
                    int len = 0;
                    while((len = is.read(bys)) != -1) {
                        System.out.println(new String(bys,0,len));
                    }*/
                    
                    String realPath = getServletContext().getRealPath("/file");
                    File file = new File(realPath);
                    if(!file.exists()) {
                        //目录不存在,则要创建
                        file.mkdirs();
                    }
                    //创建输出流对象
                    OutputStream os = new FileOutputStream(realPath + "/" + fileName);
                    byte[] bys = new byte[1024];
                    int len = 0;
                    while((len = is.read(bys)) != -1) {
                        os.write(bys, 0, len);
                    }
                    
                    os.close();
                    
                }
        
            }
        }
    }

1.4 DiskFileItemFactory的常用API

方法 描述
void setSizeThreshold(int sizeThreshold) 设置缓冲区大小
void setRepository(java.io.File repository) 设置临时目录
DiskFileItemFactory dfif = new DiskFileItemFactory();
// 设置缓冲区大小
dfif.setSizeThreshold(1024 * 1024 * 6);// 6M
// 设置临时目录
String tempPath = getServletContext().getRealPath("/temp");
File temp = new File(tempPath);
if (!temp.exists()) {
    temp.mkdirs();
}

dfif.setRepository(temp);

  • 注意:
    • 如果上传的文件不是很大,先走缓冲区
    • 如果上传文件比较大,超过缓冲区的大小,就不走缓冲区了,他会把文件先上传到临时目录中,再把临时目录中的临时文件复制到file目录中
    • 需要把整个文件上传工作完成之后才把临时文件复制到我们指定的File目录中
    • 需要先把Tomcat关掉才能手动删掉temp里面的文件
    • 临时文件临时目录的作用 是做一些续传的操作

1.5 ServletFileUpload的常用API

方法 描述
static boolean isMultipartContent(javax.servlet.http.HttpServletRequest request) 用来判断表单 link-tap的属性值是否是mutipart 是返回ture 否则返回 false
public void setFileSizeMax(long fileSizeMax) 设置一个请求中单个文件的大小
public void setSizeMax(long sizeMax) 设置一个请求中所有文件的总大小
boolean flag = ServletFileUpload.isMultipartContent(request);
if (!flag) {
    request.setAttribute("msg", "表单提交数据的方式错误!");
    request.getRequestDispatcher("/upload.jsp").forward(request,
            response);
    return;
}

ServletFileUpload upload = new ServletFileUpload(dfif);
// 设置文件的大小
upload.setFileSizeMax(1024 * 1024 * 40);//40M
// 设置请求中所有文件的总大小
upload.setSizeMax(1024 * 1024 * 40);//40M
  • 注意:
    • 工厂对象既可以通过构造方法传递,也可以通过他所对应的set方法传递

1.7 FileItem的常用API

方法 描述
long getSize() 获取表单上传文件的大小
void delete() 删除临时文件
void write(java.io.File file) 直接写一个文件

1.8 上传Servlet 改写

protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            // 判断表单提交数据的方式是否正确
            boolean flag = ServletFileUpload.isMultipartContent(request);
            if (!flag) {
                request.setAttribute("msg", "表单提交数据的方式错误!");
                request.getRequestDispatcher("/upload.jsp").forward(request,
                        response);
                return;
            }
    
            // 实现文件上传的功能
            DiskFileItemFactory dfif = new DiskFileItemFactory();
            // 设置缓冲区大小
            dfif.setSizeThreshold(1024 * 1024 * 6);// 6M
            // 设置临时目录
            String tempPath = getServletContext().getRealPath("/temp");
            File temp = new File(tempPath);
            if (!temp.exists()) {
                temp.mkdirs();
            }
    
            dfif.setRepository(temp);
    
            ServletFileUpload upload = new ServletFileUpload(dfif);
            // 设置文件的大小
            // upload.setFileSizeMax(1024 * 1024 * 40);//40M
            // 设置请求中所有文件的总大小
            // upload.setSizeMax(1024 * 1024 * 40);//40M
            List<FileItem> items = null;
            try {
                items = upload.parseRequest(request);
            } catch (FileUploadException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (items != null) {
                for (FileItem fileItem : items) {
                    if (fileItem.isFormField()) {
                        String fieldName = fileItem.getFieldName();
                        String fieldValue = fileItem.getString("UTF-8");
                        System.out.println(fieldName + "=" + fieldValue);
                    } else {
                        //获取表单上传文件的大小
                        long size = fileItem.getSize();
                        if(size > 0) {
                            String fileName = fileItem.getName();
                            /*InputStream is = fileItem.getInputStream();
                            String realPath = getServletContext().getRealPath("/file");
                            File file = new File(realPath);
                            if (!file.exists()) {
                                file.mkdirs();
                            }
        
                            OutputStream os = new FileOutputStream(realPath + "/" + fileName);
                            byte[] bys = new byte[1024];
                            int len = 0;
                            while ((len = is.read(bys)) != -1) {
                                os.write(bys, 0, len);
                            }
                            //关闭输入流,删除临时文件需要
                            is.close();
                            os.close();*/
                            String realPath = getServletContext().getRealPath("/file");
                            File file = new File(realPath);
                            if (!file.exists()) {
                                file.mkdirs();
                            }
                            //File uploadFile = new File(file,fileName);
                            try {
                                fileItem.write(new File(file,fileName));
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
        
                        }
                    }
                    //删除临时文件
                    fileItem.delete();
                }
    
            }

    }



相关文章

  • Web 基础26 文件上传概述及其入门案例

    1.1 文件上传概述 文件上传用户将本地文件通过网络上传至服务器的过程 应用场景相亲网站的照片上传招聘网站的简历上...

  • Web 基础25 文件下载概述及其入门案例

    1.1 文件的下载概述 文件下载服务器通过网络以流的形式将文件发送到客户端的过程 应用场景电影下载音乐下载安装文件...

  • Web 基础24 Listener概述及其入门案例

    1.1 监听器的概述 简述是一个实现了特定接口的普通Java类,用于监听其他对象的创建和销毁,监听其他对象的方法执...

  • 文件的上传

    文件上传概述:实现web开发中的文件上传功能,需完成如下两步操作: 在web页面中添加上传输入项 在servlet...

  • Web 基础29 AJAX入门及其案例

    1.1 AJAX的概述 1.1.1概述 AJAX是异步的JS和XML, AJAX并不是一种新的编程语言,AJAX是...

  • 28、文件上传和下载(JavaEE笔记)

    一、文件上传概述 实现web开发中的文件上传功能,需完成如下二步操作在web页面中添加上传输入项在servlet中...

  • HTML-01

    Web基础知识 Web与Internet Web的工作原理 Web的相关技术 HTML快速入门 HTML概述 超文...

  • 《JavaWeb学习总结》文件上传

    文件上传是开发中常用的功能之一,在此学习过程中做个简单的总结! 一.文件上传概述: 文件上传是什么?在web开发中...

  • Spring MVC的文件上传

    概述 文件上传是Java Web项目中的常用功能,未达到上传文件的目的,需进行下列步骤: 表单的method属性必...

  • 白帽子讲web安全-文件上传漏洞

    概述 要完成这个攻击,要满足几个条件,首先,上传的文件能够被web容器解析执行,其次用户能够从web上访问这个文件...

网友评论

      本文标题:Web 基础26 文件上传概述及其入门案例

      本文链接:https://www.haomeiwen.com/subject/tuarhftx.html