Servlet实现文件上传,可多文件上传示例

一、Servlet实现文件上传,需要添加第三方提供的jar包

下载地址:

1) commons-fileupload-1.2.2-bin.zip:

2) commons-io-2.3-bin.zip:

接着把这两个jar包放到 lib文件夹下:

二:文件上传的表单提交方式必须是POST方式,

编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded

比如:

三、举例:

1.fileupload.jsp

<% String path = requestgetContextPath(); String basePath = requestgetScheme()+"://"+requestgetServerName()+":"+requestgetServerPort()+path+"/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 01 Transitional//EN">

My JSP 'fileuploadjsp' starting page

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

    用户名:<input type="text" name="usename"&gt; <br/> 
    上传文件:<input type="file" name="file1"&gt;<br/> 
   上传文件: <input type="file" name="file2"&gt;<br/> 
   <input type="submit" value="提交"/&gt;     

2.实际处理文件上传的 FileUpLoad.java

/**

  • @author Administrator
  • 文件上传
  • 具体步骤:
  • 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包
  • 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
  • 3)对 DiskFileItemFactory 对象设置一些 属性
  • 4)高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory);
  • 目的是调用 parseRequest(request)方法 获得 FileItem 集合list ,
  • 5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理
  • 6)
  • 第一种 用第三方 提供的 itemwrite( new File(path,filename) ); 直接写到磁盘上
  • 第二种 手动处理
  • */
    public class FileUpLoad extends HttpServlet {

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {

requestsetCharacterEncoding("utf-8"); //设置编码 

//获得磁盘文件条目工厂 
DiskFileItemFactory factory = new DiskFileItemFactory(); 
//获取文件需要上传到的路径 
String path = requestgetRealPath("/upload"); 

//如果没以下两行设置的话,上传大的 文件 会占用 很多内存, 
//设置暂时存放的 存储室,这个存储室,可以和 最终存储文件 的目录不同 
/** 
 * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 
 * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 tem 格式的 
 * 然后再将其真正写到 对应目录的硬盘上 
 */ 
factorysetRepository(new File(path)); 
//设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室 
factorysetSizeThreshold(1024*1024) ; 

//高水平的API文件上传处理 
ServletFileUpload upload = new ServletFileUpload(factory); 


try { 
  //可以上传多个文件 
  List<FileItem> list = (List<FileItem>)uploadparseRequest(request); 

  for(FileItem item : list) 
  { 
    //获取表单的属性名字 
    String name = itemgetFieldName(); 

    //如果获取的 表单信息是普通的 文本 信息 
    if(itemisFormField()) 
    {           
      //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的 
      String value = itemgetString() ; 

      requestsetAttribute(name,value); 
    } 
    //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些 
    else 
    { 
      /** 
       * 以下三步,主要获取 上传文件的名字 
       */ 
      //获取路径名 
      String value = itemgetName() ; 
      //索引到最后一个反斜杠 
      int start = valuelastIndexOf("\\"); 
      //截取 上传文件的 字符串名字,加1是 去掉反斜杠, 
      String filename = valuesubstring(start+1); 

      requestsetAttribute(name,filename); 

      //真正写到磁盘上 
      //它抛出的异常 用exception 捕捉 

      //itemwrite( new File(path,filename) );//第三方提供的 

      //手动写的 
      OutputStream out = new FileOutputStream(new File(path,filename)); 

      InputStream in = itemgetInputStream() ; 

      int length = 0 ; 
      byte [] buf = new byte[1024] ; 

      Systemoutprintln("获取上传文件的总共的容量:"+itemgetSize()); 

      // inread(buf) 每次读到的数据存放在  buf 数组中 
      while( (length = inread(buf) ) != -1) 
      { 
        //在  buf 数组中 取出数据 写到 (输出流)磁盘上 
        outwrite(buf,length); 

      } 

      inclose(); 
      outclose(); 
    } 
  } 



} catch (FileUploadException e) { 
  // TODO Auto-generated catch block 
  eprintStackTrace(); 
} 
catch (Exception e) { 
  // TODO Auto-generated catch block 

  //eprintStackTrace(); 
} 


requestgetRequestDispatcher("filedemojsp")forward(request,response); 

}

}

System.out.println("获取上传文件的总共的容量:"+item.getSize());

3.filedemo.jsp

<% String path = requestgetContextPath(); String basePath = requestgetScheme()+"://"+requestgetServerName()+":"+requestgetServerPort()+path+"/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 01 Transitional//EN">

My JSP 'filedemojsp' starting page

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword3">
<meta http-equiv="description" content="This is my page">

用户名:${requestScopeusename }

文件:${requestScopefile1 }

${requestScopefile2 }

<img alt="go" src="upload/<%=(String)requestgetAttribute("file1")%> " />

4结果页面:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)