form表单文件上传+servlet后台处理

啥也不说先上代码!!!

jar包

commons-fileupload-1.2.2.jar
commons-io-1.4.jar

jsp页面
<form action="/uploadFile" enctype="multipart/form-data" method="post">
        <div> 
            名称:<input type="text" name="name" >
            密码:<input type="text" name="pwd" >
            <input type="file" name="photoname" >
            <input type="submit" value="上传" />
        </div>
 </form>

action="/uploadFile" /uploadFile是web.xml注册的servlet

servlet代码
public class CommonUplaodFiles extends HttpServlet{
  private static final String ENCODEING = "UTF-8";
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
  }
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html ;charset = utf-8 ");
        resp.setCharacterEncoding(ENCODEING);
        req.setCharacterEncoding(ENCODEING);
        //自定义的文件管理类(可忽略)
        FilesManagement fileManage = new FilesManagement();
        fileManage.setDocid(String.valueOf(new IdWorker().nextId()));
        // 判断上传表单是否为multipart/form-data类型
        // 1. 用于判断jsp表单中的enctype 的属性值是不是multipart/form-data
        boolean isMultipart = ServletFileUpload.isMultipartContent(req);
        // 如果不是multipart/form-data 则提醒
        if (!isMultipart) {
            System.out.println("提交的不是multipart/form-data");
            return;
        }
        // 核心
        // 1.创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 2. 创建ServletFileUpload对象,并设置上传文件的大小限制
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 以byte为单位 不能超过10m (1024byte = 1kb 1024kb = 1m 1024m = 1G;)
        upload.setSizeMax(10 * 1024 * 1024);
        upload.setHeaderEncoding(ENCODEING);
        //上传监听类(不需要可忽略)
        upload.setProgressListener(new ListenerUploadProgress());
        List<FileItem> items = null;
        try {
            // 3.调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
            items = upload.parseRequest(req);
        } catch (FileUploadException e) {
            throw new RuntimeException(e);
        }
        // 循环取出所有的组件 其中组件包含有 普通组件 和 上传组件
        for (FileItem item : items) {
            // 通过判断确定 item中的普通组件 使用的判断方法是isFormField
            // 是普通的表单字段
            System.out.println("item=" + item);
            if (item.isFormField()) {
                System.out.println("普通的表单字段");
                // 获取表单中的属性
                String fieldName = item.getFieldName();
                // 获取表单中的属性所对应的值
                String fieldValue = item.getString();
                System.out.println(ChineseEncodingUtils.URLDecode(fieldName,
                        ENCODEING)
                        + ":" + fieldValue);
            }else {
                System.out.println("这是上传的表单字段");
                try {
                    // 获取字节输入流
                    InputStream in = item.getInputStream();
                    // 获取上传文件的名称
                    String uploadName = item.getName();
                    // 判断上传文件的名称是否为null,如果不为空
                    if (uploadName != null) {
                        // 文件名称 = 获取文件名称,并且包含后缀
                        uploadName = FilenameUtils.getName(uploadName);
                    }
                    fileManage.setPhysicalSize(FileUtils.getPhysicalSize(item
                            .getSize()));
                    fileManage.setStorageSize(item.getSize());
                    fileManage.setFriendName(uploadName);
                    System.out.println("原文件名称=" + uploadName);
                    String uuidName = UUID.randomUUID().toString();
                    String newFileName = uuidName + "."
                            + FilenameUtils.getExtension(uploadName);
                    System.out.println("新文件名称:" + newFileName);
                    fileManage.setUuidName(newFileName);
                     //自定义的存储路径 (可根据实际自行设计)
                    String physicalAddress = SysPreperty.getProperty().UploadImagePath;
                    fileManage.setPhysicalAddress(physicalAddress);
                    // 根据真实的路径 进行实例化创建目录
                    File file = new File(physicalAddress);
                    // 如果目录不存在
                    if (!file.exists()) {
                        // 创建多级目录
                        file.mkdirs();
                    }
                    // 根据 真实目录 + "\" + 文件名称  [file.separator 的结果是 "\"]
                    OutputStream out = new FileOutputStream(physicalAddress
                            + "/" + newFileName);
                    // 定义长度 初始化值为0
                    int len = 0;
                    // 定义字节缓冲区数组
                    byte[] b = new byte[1024];
                    // 循环
                    while ((len = in.read(b)) != -1) {
                        out.write(b, 0, len);
                    }
                    // 关闭输出流
                    out.close();
                    // 关闭输入流
                    in.close();
                    // 删除临时文件
                    item.delete();
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }
        }
  }
}

测试结果


image.png

后台结果

item=name=null, StoreLocation=E:\Zcpt\tomcat-6.0.2\temp\upload_7de096b7_1707f6afbec__8000_00000000.tmp, size=9bytes, isFormField=true, FieldName=name
普通的表单字段
name:管理员
item=name=null, StoreLocation=E:\Zcpt\tomcat-6.0.2\temp\upload_7de096b7_1707f6afbec__8000_00000001.tmp, size=6bytes, isFormField=true, FieldName=pwd
普通的表单字段
pwd:123456
item=name=微信图片_20200211151600.jpg, StoreLocation=E:\Zcpt\tomcat-6.0.2\temp\upload_7de096b7_1707f6afbec__8000_00000002.tmp, size=526600bytes, isFormField=false, FieldName=photoname
这是上传的表单字段
原文件名称=微信图片_20200211151600.jpg
新文件名称:123fc30e-3c20-4c64-8c04-d4a25a4afad3.jpg
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容