1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>文件上传页面</title>
  8. </head>
  9. <body>
  10.  
  11. <!-- 上传文件是上传到服务器上,而保存到数据库是文件名 -->
  12. <!-- 上传文件是以文件转换为二进制流的形式上传的 -->
  13. <!-- enctype="multipart/form-data"需要设置在form里面,否则无法提交文件 -->
  14. <form action="us" method="post" enctype="multipart/form-data">
  15. <table>
  16. <tr>
  17. <td></td>
  18. <td><h1>文件上传</h1></td>
  19. </tr>
  20. <tr>
  21. <td>上传文件:</td>
  22. <td><input type="file" name="file"/></td>
  23. </tr>
  24. <tr>
  25. <td><div align="center">任务等级:</div></td>
  26. <td><div align="center">
  27. <select name="p2" id="p2">
  28. <option value="1">1</option>
  29. <option value="2">2</option>
  30. <option value="3">3</option>
  31. </select>
  32. </div></td>
  33. </tr>
  34. <tr>
  35. <td><div align="center">播放次数:</div></td>
  36. <td><div align="center">
  37. <input type="text" name="p3" id="p3" height="25px"/>
  38. </div></td>
  39. </tr>
  40. <tr>
  41. <td><div align="center">终端ID:</div></td>
  42. <td><div align="center">
  43. <input type="text" name="p4" id="p4" height="25px"/>
  44. </div></td>
  45. </tr>
  46. <tr>
  47. <td></td>
  48. <td><input type="submit" value="上传文件"/></td>
  49. </tr>
  50. </table>
  51. </form>
  52. </body>
  53. </html>

  

  1. package com.cscy.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.util.List;
  8. import java.util.UUID;
  9.  
  10. import javax.servlet.ServletException;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import org.apache.commons.fileupload.FileItem;
  15. import org.apache.commons.fileupload.FileUploadBase;
  16. import org.apache.commons.fileupload.ProgressListener;
  17. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  18. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  19. import org.apache.log4j.Logger;
  20.  
  21. import hy.com.port.BroadcastImpl;
  22.  
  23. /**
  24. * @ClassName: UploadServlet
  25. *
  26. */
  27. public class uploadServlet extends HttpServlet {
  28.  
  29. /**
  30. *
  31. */
  32. private static Logger logger = Logger.getLogger(SetServlet.class);
  33. private static final long serialVersionUID = 1L;
  34.  
  35. public void doGet(HttpServletRequest request, HttpServletResponse response)
  36. throws ServletException, IOException {
  37. String[] a=new String[4];
  38. String[] b={""};
  39. int A1 = 0;
  40. int B1 = 0;
  41. long C1 = 0;
  42. //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
  43. String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
  44. //上传时生成的临时文件保存目录
  45. String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
  46. File tmpFile = new File(tempPath);
  47. if (!tmpFile.exists()) {
  48. //创建临时目录
  49. tmpFile.mkdir();
  50. }
  51.  
  52. //消息提示
  53. String message = "";
  54. try{
  55. //使用Apache文件上传组件处理文件上传步骤:
  56. //1、创建一个DiskFileItemFactory工厂
  57. DiskFileItemFactory factory = new DiskFileItemFactory();
  58. //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
  59. factory.setSizeThreshold(1024*5000);//设置缓冲区的大小为5000KB,如果不指定,那么缓冲区的大小默认是10KB
  60. //设置上传时生成的临时文件的保存目录
  61. factory.setRepository(tmpFile);
  62. //2、创建一个文件上传解析器
  63. ServletFileUpload upload = new ServletFileUpload(factory);
  64. //监听文件上传进度
  65. upload.setProgressListener(new ProgressListener(){
  66. public void update(long pBytesRead, long pContentLength, int arg2) {
  67. System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
  68. /**
  69. * 文件大小为:14608,当前已处理:4096
  70. 文件大小为:14608,当前已处理:7367
  71. 文件大小为:14608,当前已处理:11419
  72. 文件大小为:14608,当前已处理:14608
  73. */
  74. }
  75. });
  76. //解决上传文件名的中文乱码
  77. upload.setHeaderEncoding("UTF-8");
  78. //3、判断提交上来的数据是否是上传表单的数据
  79. if(!ServletFileUpload.isMultipartContent(request)){
  80. //按照传统方式获取数据
  81. return;
  82. }
  83.  
  84. //设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
  85. upload.setFileSizeMax(1024*1024*100);
  86. //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
  87. upload.setSizeMax(1024*1024*10);
  88. //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
  89. List<FileItem> list = upload.parseRequest(request);
  90. int i=0;
  91. for(FileItem item : list){
  92. //如果fileitem中封装的是普通输入项的数据
  93. if(item.isFormField()){
  94. String name = item.getFieldName();
  95. //解决普通输入项的数据的中文乱码问题
  96. String value=item.getString("UTF-8");
  97. a[i]=value;
  98. //value = new String(value.getBytes("iso8859-1"),"UTF-8");
  99. System.out.println(name + "="+value);
  100. i++;
  101. }else{//如果fileitem中封装的是上传文件
  102. //得到上传的文件名称,
  103. String filename = item.getName();
  104. System.out.println(filename);
  105. //上传的文件都是保存在/WEB-INF/upload目录下的子目录当中
  106. String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");
  107. //通过文件名找出文件的所在目录
  108. String path = findFileSavePathByFileName(filename,fileSaveRootPath);
  109. File file = new File(path + "\\" + filename);//目录
  110. b[0]=(path + "\\" + filename);
  111. System.out.println(file);
  112. if(filename==null || filename.trim().equals("")){
  113. continue;
  114. }
  115. //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
  116. //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
  117. filename = filename.substring(filename.lastIndexOf("\\")+1);
  118. //得到上传文件的扩展名
  119. String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
  120. //如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
  121. System.out.println("上传的文件的扩展名是:"+fileExtName);
  122.  
  123. //获取item中的上传文件的输入流
  124. InputStream in = item.getInputStream();
  125. //得到文件保存的名称
  126. String saveFilename = filename;
  127. //得到文件的保存目录
  128. String realSavePath = makePath(saveFilename, savePath);
  129. //创建一个文件输出流
  130. FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
  131. //创建一个缓冲区
  132. byte buffer[] = new byte[1024];
  133. //判断输入流中的数据是否已经读完的标识
  134. int len = 0;
  135. //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
  136. while((len=in.read(buffer))>0){
  137. //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
  138. out.write(buffer, 0, len);
  139. }
  140. //关闭输入流
  141. in.close();
  142. //关闭输出流
  143. out.close();
  144. //删除处理文件上传时生成的临时文件
  145. item.delete();
  146. message = "文件上传成功!";
  147. }
  148. }
  149. String A=a[0]; String B=a[1]; String C=a[2];
  150. A1=Integer.parseInt(A);
  151. B1=Integer.parseInt(B);
  152. C1=Long.parseLong(C);
  153. System.out.println(A1+"\t"+B1+"\t"+C1);
  154.  
  155. }catch (FileUploadBase.FileSizeLimitExceededException e) {
  156. e.printStackTrace();
  157. request.setAttribute("message", "单个文件超出最大值!!!");
  158. request.getRequestDispatcher("/message.jsp").forward(request, response);
  159. return;
  160. }catch (FileUploadBase.SizeLimitExceededException e) {
  161. e.printStackTrace();
  162. request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");
  163. request.getRequestDispatcher("/message.jsp").forward(request, response);
  164. return;
  165. }catch (Exception e) {
  166. message= "文件上传失败!";
  167. e.printStackTrace();
  168. }
  169. BroadcastImpl.createBroadcastTask(b, A1, B1, C1);
  170. logger.info("任务创建成功!");
  171. request.setAttribute("message",message);
  172. request.getRequestDispatcher("/message.jsp").forward(request, response);
  173. }
  174.  
  175. public String findFileSavePathByFileName(String filename,String saveRootPath){
  176. int hashcode = filename.hashCode();
  177. int dir1 = hashcode&0xf; //0--15
  178. int dir2 = (hashcode&0xf0)>>4; //0-15
  179. String dir = saveRootPath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
  180. File file = new File(dir);
  181. if(!file.exists()){
  182. //创建目录
  183. file.mkdirs();
  184. }
  185. return dir;
  186. }
  187.  
  188. /**
  189. * @Method: makeFileName
  190. * @Description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
  191. * @Anthor:
  192. * @param filename 文件的原始名称
  193. * @return uuid+"_"+文件的原始名称
  194. */
  195. // private String makeFileName(String filename){ //2.jpg
  196. // //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
  197. // return UUID.randomUUID().toString() + "_" + filename;
  198. // }
  199.  
  200. /**
  201. * 为防止一个目录下面出现太多文件,要使用hash算法打散存储
  202. * @Method: makePath
  203. * @Description:
  204. * @Anthor:
  205. *
  206. * @param filename 文件名,要根据文件名生成存储目录
  207. * @param savePath 文件存储路径
  208. * @return 新的存储目录
  209. */
  210. private String makePath(String filename,String savePath){
  211. //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
  212. int hashcode = filename.hashCode();
  213. int dir1 = hashcode&0xf; //0--15
  214. int dir2 = (hashcode&0xf0)>>4; //0-15
  215. //构造新的保存目录
  216. String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
  217. //File既可以代表文件也可以代表目录
  218. File file = new File(dir);
  219. //如果目录不存在
  220. if(!file.exists()){
  221. //创建目录
  222. file.mkdirs();
  223. }
  224. return dir;
  225. }
  226.  
  227. public void doPost(HttpServletRequest request, HttpServletResponse response)
  228. throws ServletException, IOException {
  229.  
  230. doGet(request, response);
  231. }
  232. }

  

jsp Servlet 文件上传的更多相关文章

  1. jsp,servlet文件上传问题完善

    1. 上传文件时文件名中文乱码 upload.setHeaderEncoding("utf-8"); 有个疑惑: 不管设置不设置都不乱码,但是刘帅龙老师讲的时候出现了乱码 . 2. ...

  2. Servlet文件上传下载

    今天我们来学习Servlet文件上传下载 Servlet文件上传主要是使用了ServletInputStream读取流的方法,其读取方法与普通的文件流相同. 一.文件上传相关原理 第一步,构建一个up ...

  3. ServletFileUpload(Servlet文件上传)

    //**文件上传** form表单提交必须指定Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型"multipart/form-data" //1.创建磁盘文件项目工 ...

  4. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  5. JSP多文件上传到服务器

    问题描述: 作为一个Java开发Web方向的程序员,很重要的一个功能,就是上传文件功能是一定要掌握的,今天整理了一下代码. 1.JSP显示界面代码和动态添加上传文件个数. <%@ page la ...

  6. Android+jsp +html 文件上传案例 已测试 成功通过

    我文件上传一直是广大读者一个问题 今天就把成功案例写下 javaweb 网页前段 <%@ page language="java" import="java.uti ...

  7. jsp简易文件上传(common.fileupload)

    昨天开始重新架构我的V&View(维视),之前写文章使用的是一个kindediter的插件,挺好用的.最近不知道咋了,出现了些小问题.早在写V&View的时候就想用以下两种方法实现文章 ...

  8. JSP+Servlet实现上传下载

    0.项目结构 1.在WebRoot下创建index.jsp页面 <%@ page language="java" import="java.util.*" ...

  9. jsp实现文件上传下载

    文件上传: upload.jsp <form action="uploadServlet" method="post" enctype="mul ...

随机推荐

  1. supervisor 文档

    supervisor 是用 Python 开发的一个 C/S 服务.是 Linux/Unix 系统下的进程管理工具.它可以很方便的监听.启动.停止.重启一个或多个进程.用Supervisor管理的进程 ...

  2. Http长连接

    1.Http长连接 Http的请求时在TCP连接上进行发送的,TCP的连接分为长连接和短连接 打开www.baidu.com,查看Connection ID 如下图. Connection ID代表T ...

  3. 基于javaMail的邮件发送--excel作为附件

    基于JavaMail的Java邮件发送 Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用 ...

  4. 本文讲述下windows下使用rsync备份数据

    本文讲述下windows下使用rsync备份数据 需要使用的软件如下: 环境需求: 上海monitor上跑有定时任务计划备份线上数据库,现在需要把上海monitor上的备份数据拉回到179.12数据回 ...

  5. windows 命令相关

    脚本执行后的返回值:echo %errorlevel%

  6. 在ubuntu下装python3.6

    Ubuntu 14.04 and 16.04 If you are using Ubuntu 14.04 or 16.04, you can use J Fernyhough's PPA at htt ...

  7. Mysql-12条优化技巧

    应用程序慢如牛,原因多多,可能是网络的原因.可能是系统架构的原因,还有可能是数据库的原因. 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们 ...

  8. 正则表达式与Python中re模块的使用

    正则表达式与Python中re模块的使用 最近做了点爬虫,正则表达式使用的非常多,用Python做的话会用到re模块. 本文总结一下正则表达式与re模块的基础与使用. 另外,给大家介绍一个在线测试正则 ...

  9. Immutable 学习

    1.什么是Immutable Data? Immutable Data 就是一旦创建,就不能再被更改的数据.对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对 ...

  10. SQL对于 小数处理的小结

    DECLARE @digital INT --截断小数位 ,,)),@digital) AS 截断小数位 --上抛小数位 ,,)),@digital) AS 上抛小数位 SELECT CEILING ...