博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet上传文件
阅读量:5246 次
发布时间:2019-06-14

本文共 5878 字,大约阅读时间需要 19 分钟。

1 package pageckage;  2   3   4   5     import java.io.File;  6     import java.io.*;  7     import java.io.IOException;  8     import java.io.PrintWriter;  9     import java.util.List; 10  11     import javax.servlet.ServletException; 12     import javax.servlet.http.HttpServlet; 13     import javax.servlet.http.HttpServletRequest; 14     import javax.servlet.http.HttpServletResponse; 15  16     import org.apache.commons.fileupload.FileItem; 17     import org.apache.commons.fileupload.FileUploadException; 18     import org.apache.commons.fileupload.disk.DiskFileItemFactory; 19     import org.apache.commons.fileupload.servlet.ServletFileUpload; 20  21     /** 22      *  23      * @author Administrator 24      * 文件上传 25      * 具体步骤: 26      * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包 27      * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同 28      * 3)对 DiskFileItemFactory 对象设置一些 属性 29      * 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory); 30      * 目的是调用 parseRequest(request)方法  获得 FileItem 集合list , 31      *      32      * 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理 33      * 6) 34      *    第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上 35      *    第二种. 手动处理   36      * 37      */ 38      39      40     /** 41      *     jsp  页面代码 42      
43
44 45 用户名:
46 上传文件:
47 上传文件:
48
49 50
51 52 */ 53 54 55 56 public class UploadServlet extends HttpServlet { 57 58 public void doPost(HttpServletRequest request, HttpServletResponse response) 59 throws ServletException, IOException { 60 61 request.setCharacterEncoding("utf-8"); //设置编码 62 63 //获得磁盘文件条目工厂 64 DiskFileItemFactory factory = new DiskFileItemFactory(); 65 //获取文件需要上传到的路径 66 String path = request.getRealPath("/upload"); 67 68 //如果没以下两行设置的话,上传大的 文件 会占用 很多内存, 69 //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同 70 /** 71 * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 72 * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 73 * 然后再将其真正写到 对应目录的硬盘上 74 */ 75 factory.setRepository(new File(path)); 76 //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室 77 factory.setSizeThreshold(1024*1024) ; 78 79 //高水平的API文件上传处理 80 ServletFileUpload upload = new ServletFileUpload(factory); 81 82 83 try { 84 //可以上传多个文件 85 List
list = (List
)upload.parseRequest(request); 86 87 for(FileItem item : list) 88 { 89 //获取表单的属性名字 90 String name = item.getFieldName(); 91 92 //如果获取的 表单信息是普通的 文本 信息 93 if(item.isFormField()) 94 { 95 //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的 96 String value = item.getString() ; 97 98 request.setAttribute(name, value); 99 }100 //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些101 else102 {103 /**104 * 以下三步,主要获取 上传文件的名字105 */106 //获取路径名107 String value = item.getName() ;108 //索引到最后一个反斜杠109 int start = value.lastIndexOf("\\");110 //截取 上传文件的 字符串名字,加1是 去掉反斜杠,111 String filename = value.substring(start+1);112 113 request.setAttribute(name, filename);114 115 //真正写到磁盘上116 //它抛出的异常 用exception 捕捉117 118 //item.write( new File(path,filename) );//第三方提供的119 120 //手动写的121 OutputStream out = new FileOutputStream(new File(path,filename));122 123 InputStream in = item.getInputStream() ;124 125 int length = 0 ;126 byte [] buf = new byte[1024] ;127 128 System.out.println("获取上传文件的总共的容量:"+item.getSize());129 130 // in.read(buf) 每次读到的数据存放在 buf 数组中131 while( (length = in.read(buf) ) != -1)132 {133 //在 buf 数组中 取出数据 写到 (输出流)磁盘上134 out.write(buf, 0, length);135 136 }137 138 in.close();139 out.close();140 }141 }142 143 144 145 } catch (FileUploadException e) {146 // TODO Auto-generated catch block147 e.printStackTrace();148 }149 catch (Exception e) {150 // TODO Auto-generated catch block151 152 //e.printStackTrace();153 }154 155 156 request.getRequestDispatcher("filedemo.jsp").forward(request, response);157 158 159 }160 161 }

 

转载于:https://www.cnblogs.com/zfy0098/p/5308873.html

你可能感兴趣的文章
03 线程池
查看>>
手机验证码执行流程
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
jquery的contains方法
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
【★】浅谈计算机与随机数
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>