1. package com.itheima.servlet;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.io.UnsupportedEncodingException;
  9. import java.text.DateFormat;
  10. import java.text.SimpleDateFormat;
  11. import java.util.ArrayList;
  12. import java.util.Date;
  13. import java.util.List;
  14.  
  15. import javax.servlet.ServletException;
  16. import javax.servlet.http.HttpServlet;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19.  
  20. import org.apache.commons.fileupload.FileItem;
  21. import org.apache.commons.fileupload.FileUploadBase;
  22. import org.apache.commons.fileupload.FileUploadException;
  23. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  24. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  25. import org.apache.commons.io.FilenameUtils;
  26.  
  27. import com.itheima.util.IdGenertor;
  28.  
  29. public class UploadServlet3 extends HttpServlet {
  30.  
  31. public void doGet(HttpServletRequest request, HttpServletResponse response)
  32. throws ServletException, IOException {
  33. request.setCharacterEncoding("UTF-8");
  34. response.setContentType("text/html;charset=UTF-8");
  35.  
  36. //检测form是否是multipart/form-data类型的
  37. boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  38. if(!isMultipart){
  39. throw new RuntimeException("The form's enctype attribute value must be multipart/form-data");
  40. }
  41. //解析请求内容
  42. DiskFileItemFactory factory = new DiskFileItemFactory();//产生FileItem的工厂
  43. factory.setRepository(new File("d:/"));//指定临时文件的存放目录
  44. ServletFileUpload sfu = new ServletFileUpload(factory);
  45.  
  46. // sfu.setFileSizeMax(3*1024*1024);//单个文件大小限制
  47. // sfu.setSizeMax(5*1024*1024);//总文件大小
  48.  
  49. List<FileItem> items = new ArrayList<FileItem>();
  50. try {
  51. items = sfu.parseRequest(request);
  52. }catch(FileUploadBase.FileSizeLimitExceededException e) {
  53. response.getWriter().write("单个文件不能超过3M");
  54. }
  55. catch(FileUploadBase.SizeLimitExceededException e) {
  56. response.getWriter().write("总文件不能超过5M");
  57. }catch (FileUploadException e) {
  58. e.printStackTrace();
  59. throw new RuntimeException("解析请求失败");
  60. }
  61. //遍历:
  62. for(FileItem item:items){
  63. //处理普通字段
  64. if(item.isFormField()){
  65. processFormField(item);
  66. }else{
  67. //处理上传字段
  68. processUploadField(item);
  69. }
  70. }
  71. }
  72.  
  73. protected void processUploadField(FileItem item) {
  74. try {
  75.  
  76. // InputStream in = item.getInputStream();
  77. //找一个存放文件的位置;存放的文件名
  78. String fileName = item.getName();//上传的文件的文件名 C:\Users\wzhting\Desktop\a.txt a.txt(浏览器不同)
  79. if(fileName!=null&&!fileName.equals("")){
  80.  
  81. //限定上传文件的类型
  82. if(!item.getContentType().startsWith("image")){
  83. return;
  84. }
  85.  
  86. fileName = FilenameUtils.getName(fileName);
  87. fileName = IdGenertor.genGUID()+"_"+fileName;
  88.  
  89. //存放路径
  90. String realPath = getServletContext().getRealPath("/WEB-INF/files");
  91.  
  92. //生成一个子目录
  93. String childDirectory = genChildDirectory(realPath,fileName);
  94.  
  95. File storeDirectory = new File(realPath+File.separator+childDirectory);
  96. if(!storeDirectory.exists()){
  97. storeDirectory.mkdirs();
  98. }
  99. // OutputStream out = new FileOutputStream(new File(storeDirectory, fileName));
  100. //
  101. // int len = -1;
  102. // byte b[] = new byte[1024];
  103. // while((len=in.read(b))!=-1){
  104. // out.write(b, 0, len);
  105. // }
  106. // in.close();
  107. // out.close();
  108. //
  109. // item.delete();//清除临时文件
  110.  
  111. item.write(new File(storeDirectory, fileName));
  112. }
  113.  
  114. } catch (Exception e) {
  115. e.printStackTrace();
  116. }
  117. }
  118. private String genChildDirectory(String realPath, String fileName) {
  119. int hashCode = fileName.hashCode();
  120. int dir1 = hashCode&0xf;
  121. int dir2 = (hashCode&0xf0)>>4;
  122.  
  123. String str = dir1+File.separator+dir2;
  124.  
  125. File file = new File(realPath,str);
  126. if(!file.exists()){
  127. file.mkdirs();
  128. }
  129.  
  130. return str;
  131.  
  132. }
  133.  
  134. //按照日期生成子目录
  135. private String genChildDirectory(String realPath) {
  136. Date now = new Date();
  137. DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  138. String str = df.format(now);
  139.  
  140. File file = new File(realPath,str);
  141. if(!file.exists()){
  142. file.mkdirs();
  143. }
  144.  
  145. return str;
  146. }
  147.  
  148. protected void processFormField(FileItem item) {
  149. //打印到控制台
  150. String fieldName = item.getFieldName();
  151. String fieldValue = "";
  152. try {
  153. fieldValue = item.getString("UTF-8");
  154. } catch (UnsupportedEncodingException e) {
  155. e.printStackTrace();
  156. }
  157. System.out.println(fieldName+"="+fieldValue);
  158. }
  159.  
  160. public void doPost(HttpServletRequest request, HttpServletResponse response)
  161. throws ServletException, IOException {
  162. doGet(request, response);
  163. }
  164.  
  165. }

  

FileUpload组件的更多相关文章

  1. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  2. Primefaces的fileUpload组件使用

    最近在学习Primefaces(当然也是项目中需要用的).在使用其fileUpload遇到了不小的困难,现总结一下供大家及我自己今后参考使用. 1.首先是使用环境配置:正常的Primefaces开发环 ...

  3. 文件上传使用FileUpload组件进行代码实现

    使用FileUpload组件进行代码实现 实现步骤 1. 获取解析器工厂: DiskFileItemFactory 2. 获取解析器对象: ServletFileUpload 3. 解析request ...

  4. 实现文件上传功能(FileUpload组件)

    文件上传: 项目中经常用到文件上传. 自己实现文件上传,使用文件上传组件fileupload组件 1.指定表单类型为文件上传, enctype=”multipart/form-data” 2.提交方式 ...

  5. 使用 fileupload 组件完成文件的上传应用

    1. 使用 fileupload 组件完成文件的上传应用 commons-dbutils-1.3.jarcommons-fileupload-1.2.1.jar 1). 需求: > 在 uplo ...

  6. JSP文件上传--FileUpload组件

    如果使用上传操作,并且没有使用框架之类,最好使用Smartupload,因为FileUpdate太难使用. 下载组件: fileupload包:http://commons.apache.org/pr ...

  7. 使用fileupload组件

    1. 进行文件上传时, 表单需要做的准备: 1). 请求方式为 POST: <form action="uploadServlet" method="post&qu ...

  8. 模拟文件上传(三):使用apache fileupload组件进行文件批量上传

    其中涉及到的jar包 jsp显示层: <%@ page language="java" import="java.util.*" pageEncoding ...

  9. 模拟文件上传(二):使用apache fileupload组件进行文件上传

    其中涉及到的jar包: jsp显示层: <%@ page language="java" import="java.util.*" pageEncodin ...

随机推荐

  1. js 字符串中的\n不会换行

    var str1=aaaaaaa\nbbbbbbb; alert(str1); //不换行  ???不知所以然 解决办法: while (str1.indexOf("\\n") & ...

  2. Kinect的那些事儿

    Kinect结合Unity3d跑酷游戏体感Demo 今天收拾东西,在柜子的翻出了一台崭新的Kinect,说起来真是惭愧,大学毕业那会儿,慈老师(和名字一位慈祥的好老师,也是我的毕业设计指导老师)赞 助 ...

  3. DataTable 的使用

    DataTable CFHMXdt = new DataTable(); CFHMXdt.Columns.Add("group", typeof(System.String));  ...

  4. 非递归创建二叉树( C++队列 )

    非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...

  5. php排序

    关于order by排序:单条件排序:order by id(按照id排序默认从小到大) order by id desc(按照id排序从大到小) 多条件排序:order by date,id(先按照 ...

  6. Ubuntu14.04安装wineqq国际版

       一开始,我在Ubuntu14.04下安装的QQ版本是WineQQ2013SP6-20140102-Longene, 但后来发现这个版本QQ在linux下问题很多,比如不能用键盘输入密码,QQ表情 ...

  7. jQuery实现的简单小功能(实用)

    1.返回顶部使用JQuery的animate和scrollTop方法可以创建简单地返回顶部的动画: // Back to top $('#top').click(function (e) { e.pr ...

  8. SQLite的原子提交原理

    本文描述了sqlite为保证数据库文件不被损坏而采取的种种手段.. 以下是原译者的摘要:http://www.kuqin.com/shuoit/20150618/346693.html 摘要: 本文源 ...

  9. SQL语法整理

    SQL是Structured Query Language的缩写,中文全名为结构化查询语言,是一种用于数据存储,查询,更新和管理的关系数据库系统. SQL语法 创建表 create table tab ...

  10. try{}、catch(){}、throw语句

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...