servlet上传文件实现代码详解(四)

作者:柳暗花明睡一觉 时间:2021-09-04 21:17:23 

本文实例为大家分享了servlet上传文件的具体代码,供大家参考,具体内容如下

1.servlet上传文件

servlet上传文件就是将客户端的文件上传到服务器端。

向服务器发送数据时,客户端发送的http请求正文采用“multipart/form-data”数据类型,他表示复杂的多个子部分的复合表单。

为了简化“multipart/form-data”数据的处理过程。可以使用Apache组织提供是的两个开源包来来实现上传。

fileupload软件包(commons-fileupload-1.2.1.jar),负责文件上传的软件包。

io软件包(commons-io-1.4.jar)负责输入输出的软件包。

2.servlet上传文件相关类

2.1fileupload软件包把请求正文包含的复合表单的每个子部分看做FileItem对象。FileItem对象分为两种类型。

(1)formFiled:普通表单域类型,如表单中的文本和按钮等。

(2)非formFiled:上传文件类型,表单中的文件域就是这种类型。

2.2FileItemFactory接口和FileItem接口

FileItemFactory 是创建FileItem 对象的工厂。

DiskFileItemFactory 实现了FileItemFactory接口,DiskFileItemFactory用于创建DiskFileItem对象。

DiskFileItem对象用于把客户端上传的文件保存在客户端。

2.3ServletFileUpload 类

ServletFileUpload为文件上传处理器。和DiskFileItemFactory对象关联。

3.上传文件案例

上传文件页面(upload.html)


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<form action="upload" enctype="multipart/form-data" method="POST">
 <input name="username" size="30">
 <input type="file" name="file1" size="30">
 <input type="file" name="file2" size="30">
 <input type="submit" name="submit" value="upload">
</form>
</body>
</html>

上传文件的servlet类


package com.learn;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.poi.common.usermodel.LineStyle;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
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.PrintWriter;
import java.util.Iterator;
import java.util.List;

public class ServletUpload extends HttpServlet {

private String filePath;
 private String tempFilePath;
 @Override
 public void init(ServletConfig config) throws ServletException {
   super.init(config);
   //获取类文件路径初始化值
   filePath = config.getInitParameter("filePath");
   tempFilePath = config.getInitParameter("tempFilePath");
   System.out.println("init filepath:"+filePath);
   System.out.println("tempFilePath:"+tempFilePath);

//获取文件路径真实值
   filePath = config.getServletContext().getRealPath(filePath);
   tempFilePath = config.getServletContext().getRealPath(tempFilePath);
   System.out.println("realPath:"+filePath);
   System.out.println("tempFilePath"+tempFilePath);

}

@Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   super.doPost(req, resp);
   //设置返回内容为纯文字内容
   resp.setContentType("text/plain");
   resp.setCharacterEncoding("UTF-8");
   //获取输出对象
   PrintWriter out = resp.getWriter();

//创建一个基于硬盘的FileItem工厂
   DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
   //设置向硬盘写数据的缓冲区大小,这里为4k
   diskFileItemFactory.setSizeThreshold(4*1024);
   //设置临时目录
   diskFileItemFactory.setRepository(new File(tempFilePath));

//创建一个文件上传处理器
   ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
   //设置文件上传的大小
   servletFileUpload.setSizeMax(4*1024*1024);
   //获取参数
   try {
     //获取表单参数
     List list = servletFileUpload.parseRequest(req);
     //获取迭代器
     Iterator iterator = list.iterator();
     //迭代列表
     while(iterator.hasNext()){

//将参数转型为FileItem类型
       FileItem fileItem = (FileItem) iterator.next();
       if(fileItem.isFormField()){
         System.out.println("处理表单非文件类型数据");
         processFormFiled(fileItem,out);
       } else {
         System.out.println("处理吧表单文件类型数据");
         processUploadFile( fileItem,out);
       }

}
     System.out.println("关闭输出流");
     out.close();

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

private void processFormFiled(FileItem fileItem,PrintWriter printWriter){
   //获取表单域的名称
   String name = fileItem.getName();
   //获取表单域的值
   String value = fileItem.getString();
   printWriter.print("name:"+name+"value:"+value);

}

private void processUploadFile(FileItem fileItem,PrintWriter printWriter) throws Exception {

//获取文件名称
   String fileName = fileItem.getName();
   int i = fileName.lastIndexOf("\\");
   fileName = fileName.substring(i+1,fileName.length());
   //获取文件大小
   long fileSize = fileItem.getSize();
   System.out.println("fileName:"+fileName+"| fileSize:"+fileSize);
   if("".equals(fileName) && fileSize == 0)
     return;
   //将文件写入指定位置
   File upload = new File(filePath+File.separator+fileName);
   fileItem.write(upload);
   //输出结果
   printWriter.print(fileName+"is saved");
   System.out.println("处理完毕");
   printWriter.print("the size of "+fileName+" is "+fileSize);
 }
}

3.web.xml配置


 <servlet>
   <servlet-name>upload</servlet-name>
   <servlet-class>com.learn.ServletUpload</servlet-class>
   <init-param>
     <param-name>filePath</param-name>
     <param-value>file</param-value>
   </init-param>
   <init-param>
     <param-name>tempFilePath</param-name>
     <param-value>temp</param-value>
   </init-param>
 </servlet>
 <servlet-mapping>
   <servlet-name>upload</servlet-name>
   <url-pattern>/upload</url-pattern>
 </servlet-mapping>

来源:http://www.cnblogs.com/wwyx-xi/p/7587741.html

标签:servlet,上传
0
投稿

猜你喜欢

  • Java实现顺序表和链表结构

    2023-11-13 09:35:43
  • C#模拟实现抽奖小程序的示例代码

    2021-08-27 22:19:17
  • 深入讲解基于JDK的动态代理机制

    2022-07-19 07:13:32
  • java实现字符串和数字转换工具

    2021-08-28 15:50:19
  • C#读取目录下所有指定类型文件的方法

    2023-05-01 10:59:14
  • Go Java算法猜数字游戏示例详解

    2022-03-02 21:01:50
  • .net实现裁剪网站上传图片的方法

    2021-09-24 01:41:05
  • Eclipse下Javassist正确使用方法代码解析

    2021-07-24 18:43:57
  • Winform让DataGridView左侧显示图片

    2021-09-24 03:50:38
  • java和 javaw 及 javaws的区别解析

    2023-07-21 06:31:05
  • IDEA社区版下载安装流程详解(小白篇)

    2021-11-13 12:37:18
  • c#单例模式(Singleton)的6种实现

    2021-07-01 10:17:51
  • mybatis 查询返回Map<String,Object>类型

    2023-11-14 07:06:09
  • Java调用Oracle存储过程详解

    2022-09-09 03:19:45
  • SpringBoot配置shiro安全框架的实现

    2023-09-07 19:55:38
  • Mybatis-Plus环境配置与入门案例分析

    2022-02-05 01:15:01
  • 了解Java线程池创建过程

    2022-09-29 20:45:49
  • 老生常谈Java中List与ArrayList的区别

    2023-03-26 19:52:33
  • C# SendInput 模拟鼠标操作的实现方法

    2022-03-15 00:07:25
  • C#使用回溯法解决背包问题实例分析

    2023-11-22 20:21:22
  • asp之家 软件编程 m.aspxhome.com