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
比如:<form action="FileUpLoad"enctype="multipart/form-data"method="post">

三、举例

1.fileupload.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <base href="<%=basePath%>" rel="external nofollow" rel="external nofollow" > 

 <title>My JSP 'fileupload.jsp' starting page</title> 

 <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">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css" rel="external nofollow" rel="external nofollow" >
 --> 

 </head> 

 <body>
 <!-- enctype 默认是 application/x-www-form-urlencoded -->
 <form action="FileUpLoad" enctype="multipart/form-data" method="post" > 

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

 </form> 

 </body>
</html>

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

package com.servlet.fileupload; 

import java.io.File;
import java.io.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List; 

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

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; 

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

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

 request.setCharacterEncoding("utf-8"); //设置编码 

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

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

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

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

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

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

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

   request.setAttribute(name, filename); 

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

   //item.write( new File(path,filename) );//第三方提供的 

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

   InputStream in = item.getInputStream() ; 

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

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

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

   } 

   in.close();
   out.close();
  }
  } 

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

  //e.printStackTrace();
 } 

 request.getRequestDispatcher("filedemo.jsp").forward(request, response); 

 } 

}

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

3.filedemo.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <base href="<%=basePath%>" rel="external nofollow" rel="external nofollow" > 

 <title>My JSP 'filedemo.jsp' starting page</title> 

 <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">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css" rel="external nofollow" rel="external nofollow" >
 --> 

 </head> 

 <body> 

 用户名:${requestScope.usename } <br/>
 文件:${requestScope.file1 }<br/>
 ${requestScope.file2 }<br/>
 <!-- 把上传的图片显示出来 -->
 <img alt="go" src="upload/<%=(String)request.getAttribute("file1")%> " /> 

 </body>
</html>

4.结果页面

下载链接:
1)Struts2之下载  点击打开链接
2)Struts2之上传  点击打开链接

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

(0)

相关推荐

  • java基于servlet实现文件上传功能解析

    最近项目需要做一个文件上传功能,做完了分享下,顺带当做笔记. 上传功能用后台用java实现,前端主要是js的ajax实现.后台还加入定时删除临时文件. 效果如图 首先是上传功能的主要类,下面是代码 package util.upload; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterat

  • 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 比如: &l

  • Servlet实现简单文件上传功能

    本文实例为大家分享了Servlet文件上传的具体代码,供大家参考,具体内容如下 两点要素: 1.表单提交方式必须是post 2.enctype一定要是multipart/form-data. enctype的默认值是application/x-www-form-urlencoded, 这种编码格式只支持键值对的数据,?键=值&键=值,只能是字符串,无法传输文件. multipart/form-data这种编码可以上传文件 需要的jar包: 实现: import java.io.BufferedI

  • Android中发送Http请求(包括文件上传、servlet接收)的实例代码

    复制代码 代码如下: /*** 通过http协议提交数据到服务端,实现表单提交功能,包括上传文件* @param actionUrl 上传路径 * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */public static void postMultiParams(String actionUrl, Map<String, String> params, FormBean[] files) {try {PostMethod p

  • servlet+JSP+mysql实现文件上传的方法

    本文实例讲述了servlet+JSP+mysql实现文件上传的方法.分享给大家供大家参考,具体如下: 一.文件上传的基本操作: 1. 表单属性enctype的设置 multipart/form-data和application/x-www-form-urlencoded的区别 FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是"application/x-www-form-urlencoded". 然而,在向服务器发送大量的文本.包含非ASCI

  • SpringMVC + servlet3.0 文件上传的配置和实现代码

    简单几步,实现SpringMVC+servlet3.0文件上传功能: 第一步:配置web.xml文件中的servlet,添加multipart-config: <!-- SpringMVC --> <servlet> <servlet-name>myWeb</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-clas

  • Servlet3.0实现文件上传的方法

    Servlet 实现文件上传 所谓文件上传就是将本地的文件发送到服务器中保存.例如我们向百度网盘中上传本地的资源或者我们将写好的博客上传到服务器等等就是典型的文件上传. Servlet 3.0 上次完成文件下载功能使用的是 Servlet 2.5,但是想要完成文件上传,那么继续使用 Servlet 2.5 肯定不是一个好的选择,因此我们使用 Servlet 3.0 来完成文件上传.下面我来简单介绍一下 Servlet 3.0 的新特性: 1.新增的注解支持 该版本新增了若干注解,用于简化 Ser

  • java基于servlet使用组件smartUpload实现文件上传

    文件上传在web应用中是非常常见的,现在我就介绍下基于servlet的文件上传,基于Struts2的文件上传可以看: 页面端代码: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <ht

  • Java Servlet简单实例分享(文件上传下载demo)

    项目结构 src com servletdemo DownloadServlet.java ShowServlet.java UploadServlet.java WebContent jsp servlet download.html fileupload.jsp input.jsp WEB-INF lib commons-fileupload-1.3.1.jar commons-io-2.4.jar 1.简单实例 ShowServlet.java package com.servletdem

  • servlet+jquery实现文件上传进度条示例代码

    现在文件的上传,特别是大文件上传,都需要进度条,让客户知道上传进度. 本文简单记录下如何弄进度条,以及一些上传信息,比如文件的大小,上传速度,预计剩余时间等一些相关信息.代码是匆忙下简单写的,一些验证没做,或代码存在一些隐患,不严谨的地方.本文代码只供参考. 进度条的样式多种多样,有些网站弄得非常绚烂漂亮.本文UI端不太懂,只会一些简单的基本的css而已,所以进度条弄得不好看.本文侧重的给读者提供一个参考,一个实现思路而已. 注:由于jQuery版本用的是2.1.1,所以如果跑本例子源码,请用I

随机推荐