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

2018-04-05  本文已影响11人  小熊先生很不开心

1.1 文件上传概述

名称 描述
jspSmartUpload 应用在jsp上的文件上传和文件下载的组件
fileupload 应用在java上的文件上传技术,由Apache开源组织提供
servlet3.0 提供了文件上传的技术
Struts 提供了文件上传的技术

1.2 JSP编写

<%@ 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的编写

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);

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

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();
                }
    
            }

    }



上一篇下一篇

猜你喜欢

热点阅读