简单操作实现Java jsp servlet文件上传过程解析

 更新时间:2019年10月09日 09:03:21   作者:小龙_T无限  
这篇文章主要介绍了简单操作实现Java jsp servlet文件上传过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

实现文件上传的方式

1、进入http://commons.apache.org/proper/commons-fileupload/using.html

2、点击用户指南

3、对着用户指南一步步复制粘贴,并把代码撸成自己想要的样子

补充:记得要将commons-io-2.4.jar和commons-fileupload-1.2.2.jar这两个包放到编译器里面

现成的代码

JSP 前端页面

<%--
 Created by IntelliJ IDEA.
 User: Administrator
 Date: 2019/10/8
 Time: 16:14
 To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>作业三第1遍</title>
</head>
<body>
文件上传注意事项:<br>
<ol>
  <li>提交方式必须是post</li>
  <li>enctype="multipart/form-data"是以字节数据的形式提交表单,否则默认是kv形式,只会提交文件名</li>
  <li>如果以默认的application/x-www-form-urlencode的方式提交,上传的就不是文件本身</li>
</ol>
<%--application/x-www-form-urlencoded 以键值对的方式上传 --%>
<%-- multipart/form-data 以二进制的方式上传 --%>
<form action="/work/UploadServlet" method="post" enctype="multipart/form-data">
  <input type="text" name="data1" value="data1Value">
  <hr>
  <input type="text" name="data2" value="data2Value">
  <hr>
  <input type="file" name="dataFile">
  <hr>
  <input type="submit" value="上传该表单">
  <hr>
</form>


</body>
</html>

Servlet 后台处理页面

package com.bd25;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;

@WebServlet(name = "UploadServlet", urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //处理中文乱码--已经测试这个要不要无所谓
    request.setCharacterEncoding("UTF-8");

    //判断是不是传入的一个二进制的流
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    //创建一个简单工厂实例
    FileItemFactory factory = new DiskFileItemFactory();
    //创建一个新的文件上传处理程序
    ServletFileUpload upload = new ServletFileUpload(factory);
    //解析request
    try {
      List<FileItem> fileItems = upload.parseRequest(request);
      //处理上传的项目
      Iterator iter=fileItems.iterator();
      while(iter.hasNext()){
        FileItem item = (FileItem) iter.next();
        if (item.isFormField()){
          //普通域
          processFormField(item);
        }else{
          //文件域 此处注意processUploadFile()方法的参数里面传入request的目的是让下面写文件的时候获取根目录用的
          processUploadFile(item,request);
        }
          
      }

    } catch (FileUploadException e) {
      e.printStackTrace();
    }


    ServletInputStream inputStream = request.getInputStream();
    byte[] bs=new byte[1024];
    int total=-1;
    while ((total=inputStream.read(bs))!=-1){
      System.out.print(new String(bs,0,total));
    }
  }

  /**
   * 文件域
   * @param item
   * @param request
   */
  private void processUploadFile(FileItem item, HttpServletRequest request) {
    //获取文件相关信息
    String fileName="";
    if (!item.isFormField()) {
      String fieldName = item.getFieldName();
      fileName = item.getName();
      String contentType = item.getContentType();
      boolean isInMemory = item.isInMemory();
      long sizeInBytes = item.getSize();
      System.out.println("文件名: "+fileName+" 文件属性:"+fieldName+" 文件大小:"+sizeInBytes+" 文件类型:"+contentType);
    }
    //以下是转存操作,找到储存文件的根路径
    String fileRootPath=request.getServletContext().getRealPath("/WEB-INF/upload");
    File dir = new File(fileRootPath);
    if (!dir.exists()){
      dir.mkdirs();
    }
    //写文件
    File file = new File(fileRootPath+"/"+fileName);
    try {
      item.write(file);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 普通域
   * @param item
   */
  private void processFormField(FileItem item) {
    String key = item.getFieldName();
    String value = null;
    try {
      //处理中文乱码
      value = item.getString("UTF-8");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    System.out.println(key+"----"+value);
  }

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

  }

  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.service(req, resp);
    System.out.println("刷新....");
  }

  @Override
  public void init() throws ServletException {
    super.init();
    System.out.println("初始化....");
  }
}

运行结果

//说明:路径出现的位置就是网页发布的路径

//说明:路径出现的位置就是网页发布的路径

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot 2.X快速整合jpa过程解析

    Spring Boot 2.X快速整合jpa过程解析

    这篇文章主要介绍了Spring Boot 2.X 如何快速整合jpa?,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Java实现世界上最快的排序算法Timsort的示例代码

    Java实现世界上最快的排序算法Timsort的示例代码

    Timsort 是一个混合、稳定的排序算法,简单来说就是归并排序和二分插入排序算法的混合体,号称世界上最好的排序算法。本文将详解Timsort算法是定义与实现,需要的可以参考一下
    2022-07-07
  • Java多线程4种拒绝策略小结

    Java多线程4种拒绝策略小结

    当线程池中的任务队列已满且无法再接受新的任务时,就需要采取拒绝策略来处理这种情况,本文主要介绍了Java多线程拒绝策略,包含了四种常见的拒绝策略,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • SpringBoot项目中公共字段填充的实现

    SpringBoot项目中公共字段填充的实现

    本文主要介绍了SpringBoot项目中公共字段填充的实现,利用SpringBoot的Aop思想和自定义注解和反射机制的方法来实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 利用spring aop实现动态代理

    利用spring aop实现动态代理

    这篇文章主要为大家详细介绍了利用spring aop实现动态代理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • jenkins配置详细指南(附jdk多个版本配置)

    jenkins配置详细指南(附jdk多个版本配置)

    Jenkins是一款CICD(持续集成与持续交付)工具,Jenkins可以帮你在写完代码后,一键完成开发过程中的一系列自动化部署的工作,这篇文章主要给大家介绍了关于jenkins配置的相关资料,文中还附jdk多个版本配置指南,需要的朋友可以参考下
    2024-02-02
  • java实现液晶数字字体显示当前时间

    java实现液晶数字字体显示当前时间

    这篇文章主要为大家详细介绍了java实现液晶数字字体显示当前时间,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java常见面试题之final在java中的作用是什么

    Java常见面试题之final在java中的作用是什么

    这篇文章主要介绍了Java常见面试题之final在java中的作用是什么,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java mybatis框架配置详解

    java mybatis框架配置详解

    在本篇文章里小编给大家整理的是一篇关于java mybatis框架配置详解内容,对此有兴趣的朋友们可以参考下。
    2021-02-02
  • java基础之Collection与Collections和Array与Arrays的区别

    java基础之Collection与Collections和Array与Arrays的区别

    这篇文章主要介绍了java基础之Collection与Collections和Array与Arrays的区别的相关资料,本文主要说明两者的区别以防大家混淆概念,需要的朋友可以参考下
    2017-08-08

最新评论