5.1其他WEB技术——文件上传

JAVAWEB学习文章索引点这里
文件上传需要注意的地方:
1,表单类型需要设置为post类型
2,表单提交方式为input标签 type=”file”
3,from标签的enctype属性需要设置为”mutipart/form-data”
4,如果上传文件比较单一的话可以手写上传方式,这里使用的是apache的上传工具包,需要导包commons-fileupload.jar和commons-io.jar
上传的时候会让你指定缓冲区大小和缓冲目录,如果上传文件大小小于缓冲区大小则直接上传,否则在缓冲区会创建缓冲文件。
由于将表单enctype属性需要设置为”mutipart/form-data”,所以普通属性的提交也会受到影响,在这里会被工具包同样封装到list集合中,在取出的时候先判断其是属性还是文件
这里的上传实现的功能有:
1,文件缓冲大小,缓冲区设置
2,文件名编码设置为utf-8
3,单个文件大小和多个文件大小限制
4,文件上传进度监听器
5,处理普通表单属性
6,文件上传类型限制
7,通过UUID算法避免重复名
8,文件保存和缓冲区缓冲文件删除
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>

<font color="red"> ${msg } </font>
<%--1.提交方式必须是post,并且post方式才会有content-type属性
    2.提交必须要有<input type="file">
    3.表单enctype需要设置为multipart/form-data
 --%>
<form method="post" action="FileUpload1" enctype="multipart/form-data">
    请选择文件:<input type="file" name="file1"/><br/>
    请选择文件:<input type="file" name="file2"/><br/>
    <input name="name" value="张三"/><br/>
    <input name="age" value="20"/><br/>
    <input type="submit" value="上传"/>
</form>
</body>
</html>

servlet代码:

package com.servlet;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.apache.commons.io.FileUtils;

import java.util.*;

@WebServlet("/FileUpload1")
public class FileUpload1 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 创建上传对象,设置文件缓冲区大小和文件缓冲区目录
        DiskFileItemFactory factory = new DiskFileItemFactory(10 * 1024, new File("F:/各类缓存/upload"));
        // 该类用于在servlet中实现文件上传
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 设置文件名的编码,文件上传限制
        upload.setHeaderEncoding("utf-8");
        upload.setFileSizeMax(300 * 1024);// 设置单个文件大小限制,单位字节,这里是300kb
        upload.setSizeMax(400 * 1024);// 设置整体文件大小限制,单位字节,这里是400kb
        upload.setProgressListener(new MyProgressListener());
        // 解析request数据、每一个上传的文件对应一个被封装好的FileItem中
        // 普通文本类型的参数也会被封装到list中
        try {
            List<FileItem> list = upload.parseRequest(request);
            // 取出第一个上传的文件
            for (FileItem file : list) {
                //判断是文件还是属性
                if (file.isFormField()) {
                    //判断参数名
                    if("name".equals(file.getFieldName())) {
                        String name = file.getString("utf-8");//获取到该参数,并设置字符集编码
                        System.out.println(name);
                    }
                    if("age".equals(file.getFieldName())) {
                        int age = Integer.parseInt(file.getString());
                        System.out.println(age);
                    }
                } else {
                    // 得到文件大小
                    long fileSize = file.getSize();
                    // 得到并限制文件类型
                    String contentType = file.getContentType();
                    if (!contentType.toLowerCase().matches("text/plain")) {
                        throw new FileTypeErrorExeception("上传的文件类型不是文本类型,请重新选择");
                    }
                    // 得到文件数据内容
                    InputStream in = file.getInputStream();
                    // 得到文件名,并通过UUID算法生成随机名称
                    String fileName = file.getName();
                    fileName = UUID.randomUUID().toString() + fileName;
                    // 将文件数据内容储存到服务器端的硬盘中
                    FileUtils.copyInputStreamToFile(in, new File("F:/各类缓存/upload/" + fileName));
                    // 上传完毕手动清理缓存文件
                    file.delete();
                    System.out.println(fileName + fileSize + contentType + in);
                }
            }
        } catch (FileTypeErrorExeception e) {
            // 出现文件类型异常后,将错误信息转发到上传页面
            request.setAttribute("msg", e.getMessage());
            request.getRequestDispatcher("upload1.jsp").forward(request, response);
        } catch (FileSizeLimitExceededException e) {
            request.setAttribute("msg", "超过单个文件大小限制");
            request.getRequestDispatcher("upload1.jsp").forward(request, response);
        } catch (SizeLimitExceededException e) {
            request.setAttribute("msg", "超过总文件大小限制");
            request.getRequestDispatcher("upload1.jsp").forward(request, response);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

class FileTypeErrorExeception extends Exception {
    public FileTypeErrorExeception(String msg) {
        super(msg);
    }
}

class MyProgressListener implements ProgressListener {
    public void update(long pBytesRead, long pContentLength, int pItems) {
        System.out.println("已经上传了" + pBytesRead + "字节,总字节数为" + pContentLength + "字节,现在正在上传第" + pItems + "个文件!");
    }

}

猜你喜欢

转载自blog.csdn.net/smallhc/article/details/81065509