最近公司需要上传Excel文件至服务器,并从文件中读取数据后封装Bean入库,以下是整理出来的经验:
一:所需的Jar

package com.zhuling.servlet;import com.zhuling.tools.FileTools;
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 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.util.List;
import java.util.Map;/*** 测试所用的Servlet* @author Juling* @date October 17th.*/
public class FileUploadServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");// 判断是否支持文件上传if (!ServletFileUpload.isMultipartContent(request)) {Map<String, String[]> map = FileTools.getFormField(request);for (Map.Entry<String, String[]> entry : map.entrySet()) {System.out.println("key=" + entry.getKey());String[] strs = entry.getValue();for (String str : strs) {System.out.println(new String(str.getBytes("utf-8"), "utf-8"));}}} else {try {// 创建一个DiskFileItemfactory工厂类DiskFileItemFactory factory = new DiskFileItemFactory();
//                factory.setRepository(new File("f:\\"));// 指定临时文件的存储目录// 创建一个ServletFileUpload核心对象ServletFileUpload fileUpload = new ServletFileUpload(factory);// 解决上传表单项乱码问题fileUpload.setHeaderEncoding("UTF-8");// 限制上传文件的大小 3MfileUpload.setFileSizeMax(1024 * 1024 * 3);fileUpload.setSizeMax(1024 * 1024 * 6);List<FileItem> data = fileUpload.parseRequest(request);// 遍历表单数据for (FileItem fileItem : data) {// 普通表单项if (fileItem.isFormField()) {System.out.println("key=" + fileItem.getFieldName() + ",value=" + fileItem.getString("UTF-8"));} else {// 文件上传项String savePath = request.getSession().getServletContext().getRealPath(File.separator + "WEB-INF" + File.separator + "excel");// 文件上传FileTools.processUploadField(fileItem, savePath);}}} catch (FileUploadException e) {e.printStackTrace();}}}
}

文件上传类

package com.zhuling.tools;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.io.FilenameUtils;import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;/*** 实现文件上传* @author Juling * @date October 17th.*/
public class FileTools {/*** 获取普通表单字段** @param request* @return*/public static Map<String, String[]> getFormField(HttpServletRequest request) {return request.getParameterMap();}/*** 文件上传** @param fileItem* @param savePath*/public static void processUploadField(FileItem fileItem, String savePath) {InputStream inputStream = null;OutputStream outputStream = null;try {inputStream = fileItem.getInputStream();// 对savePath进行进一步处理 按每天的日期存放至一个文件夹方便管理savePath = savePath + File.separator + new SimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime());File file = new File(savePath);// 如果文件夹不存在或者已存在但不是一个文件夹if (!file.exists() && !file.isDirectory()) {file.mkdirs();}String fileName = fileItem.getName();if (!(fileName.length() == 0 || fileName.trim().equals(""))) {// 考虑到不同浏览器下对获取文件名的结果不同,对文件名进一步进行处理// fileName.substring(fileName.lastIndexOf(File.separator) + 1);fileName = FilenameUtils.getName(fileName); // 效果同上}// 解决文件名同名问题String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());StringBuilder stringBuilder = new StringBuilder(savePath);String filePath = stringBuilder.append(File.separator).append(fileName).insert(stringBuilder.lastIndexOf("."),timeStamp).toString();outputStream = new FileOutputStream(filePath);byte[] arr = new byte[1024 * 8];int len;while ((len = inputStream.read(arr)) != -1) {outputStream.write(arr, 0, len);outputStream.flush();}// 上传文件 自动删除临时文件fileItem.delete();} catch (IOException e) {e.printStackTrace();} finally {try {if (inputStream != null) inputStream.close();if (outputStream != null) outputStream.close();} catch (IOException e) {e.printStackTrace();}}}
}

测试结果

浅谈ServletFileUpload相关推荐

  1. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

  2. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

  3. 学校计算机机房好处,浅谈学校计算机机房维护

    浅谈学校计算机机房维护    现在的学校机房都配置了数量较多的计算机,而且机房的使用非常频繁.对于怎样维护好计算机,特别是计算机软件系统,对广大计算机教师来说是一个很重要且非常现实的问题.下面就本人在 ...

  4. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  5. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  6. 浅谈GCC预编译头技术

    浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...

  7. 【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)

    震惊!世上最接地气的字符串浅谈(HASH+KMP) 笔者过于垃圾,肯定会有些错的地方,欢迎各位巨佬指正,感激不尽! 引用:LYD的蓝书,一本通,DFC的讲稿,网上各路巨佬 Luguo id: 章鱼那个 ...

  8. 浅谈几种区块链网络攻击以及防御方案之其它网络攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特 ...

  9. 浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/14/network_attack_of_blockchain_ddos_attack/ 写在前面的话 自比特币 ...

最新文章

  1. 【翻译】TCP backlog在Linux中的工作原理
  2. 分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!
  3. 熟悉Python Interpreter解释器
  4. IPhone 应用程序管理
  5. 65.4. Other GUI - phpOraAdmin
  6. 如何在AWS上架设文件服务器
  7. php读取某类型文件代码,php代码实现读取文件头判断文件类型
  8. prim算法 求最小生成树
  9. LeetCode刷题记录_最长公共前缀
  10. 刚进职场的IT前端小白,如何规划自己的未来之路?有哪些发展方向?
  11. eos 钱包 nacos 安装文档
  12. Infopath入门到精通系列-3 Infopath manifest.xsf文件 解析
  13. 常见Flash小游戏开发核心思想笔记——《拼图》
  14. win32(7)--文件操作
  15. windows邮件绑定谷歌邮箱
  16. Java游戏项目之坦克大战
  17. Xtend == 与 ===
  18. 计算机专业的三行情书,各学科给你的三行情书
  19. java兼容的浏览器_介绍几款浏览器兼容性测试工具
  20. 【Python】计算XIRR

热门文章

  1. vercel+vue生成免域名静态网站
  2. android 仿旅游日历控件_Android日历控件MaterialCalendarView
  3. 净空法师:年轻时候好,是你前生所修的
  4. linux 删除文件夹下面指定类型的文件
  5. C#调用百度语音SKD实现语音播放
  6. LastPass 开发者系统被黑客窃取源代码
  7. asp.net 设置 excel alignment_教你如何用python轻轻松松操作Excel、Word、CSV,一文就够了,赶紧码住!!!
  8. 华为AirEngine 9700S AC控制器上传 license文件出现不存在上传失败
  9. Python二级练习:turtle库(绘制五角星、七彩圆圈)
  10. 今日文摘:浅谈 HTML5 的游戏化之路