文件上传

来源:互联网 发布:mac下方出现白条 编辑:程序博客网 时间:2024/05/29 14:44


·实现web开发中的文件上传功能,需完成两个步骤:

       1、在web页面中添加传输项(jsp页面或html页面)

1-1·<input type=”file”>标签用于在web页面中添加文件上传输入项,设置文件上传输入项时需注意:

                     ·必须设置input输入项的name属性,否则浏览器将不会发送上传的数据

·必须把form的enctype属性值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

       2、在servlet中读取上传文件的数据,并保存到本地硬盘中

·request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端变成直接读取上传数据,并分别解析出相应的文件数据是一项覅长麻烦的事。

·为方便用户处理上传数据,Apache科院组织提供了一个用来处理表单文件上传的一个开源组件(Commons-fileupload),该组件性能优异,并且其api使用极其简单,可以让开发人员轻松实现web文件上传功能,通常使用Commons-fileupload组件实现。

使用该组件实现文件上传功能,需要导入该组件相应的支撑jar包。

       3、DiskFileItemFactory

•        DiskFileItemFactory是创建FileItem对象的工厂,这个工厂类常用的方法:

•        public voidsetSizeThreshold(int sizeThreshold) :设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓存上传文件。

•        public voidsetRepository(java.io.File repository) :指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").

•        public DiskFileItemFactory(int sizeThreshold,java.io.File repository) :构造函数

4、ServletFileUpload

ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:

•        booleanisMultipartContent(HttpServletRequest request) :判断上传表单是否为multipart/form-data类型

•        ListparseRequest(HttpServletRequest request):解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。

•        setFileSizeMax(long fileSizeMax):设置上传文件的最大值

•        setSizeMax(long sizeMax) :设置上传文件总量的最大值

•        setHeaderEncoding(java.lang.String encoding):设置编码格式

•        setProgressListener(ProgressListener pListener)

 

5、利用以上类编写的文件上传的代码:

UploadServlet2-----------在servlet中读取上传文件的数据

 

public class UploadServlet2extends HttpServlet {

   

    public void doGet(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException, IOException {

 

       this.doPost(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException, IOException {

 

       //文件上传功能

       try {

           //创建一个解析器工厂

           DiskFileItemFactory factory=new DiskFileItemFactory();

           //得到解析器

           ServletFileUpload upload=new ServletFileUpload(factory);

           upload.setFileSizeMax(3000);

           upload.setSizeMax(2000);

          

           //队请求进行解析,有几个输入项,就会有几个FileItem对象

           List<FileItem> list=upload.parseRequest(request);

           //迭代list集合,获取list集合中的每一个输入项

           for(FileItem item:list){

              //判断输入的类型

              if(item.isFormField()){

                  //说明是一个普通的输入项

                  String inputName=item.getFieldName();

                  String inputValue=item.getString();

                  System.out.println(inputName+"-----"+inputValue);

              }else{

                  //处理上传文件

                  String filename=item.getName();//上传文件的名字

                  filename=filename.substring(filename.lastIndexOf("\\")+1);//因为使用的不同浏览器进行访问,为了得到文件名

                  System.out.println(filename);

                  InputStreamis=item.getInputStream();

                  FileOutputStream fos=new FileOutputStream("c:\\"+filename);

                  byte[] buff=new byte[1024];

                  int len=0;

                  while((len=is.read(buff))>0){//从上传文件中读取

                     fos.write(buff,0,len);//写入到磁盘相关文件中

                  }

              }

           }

           request.setAttribute("message","上传成功!");

          

       } catch (FileUploadException e) {

           // TODO Auto-generatedcatch block

           request.setAttribute("message","上传失败!");

       }

       request.getRequestDispatcher("/message.jsp").forward(request,response);

    }

}

 

Upload.jsp------------------在web页面中添加传输项(jsp页面或html页面)

<%@ 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%>">

   

    <title>上传页面</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">

    -->

 

  </head>

    <form action="${pageContext.request.contextPath}/servlet/UploadServlet2" method="post" enctype="multipart/form-data">

    上传用户:<input type="text" name="user"/><br>

    上传文件:<input type="file" name="file1"/><br>

    上传文件:<input type="file" name="file2"/><br>

    <input type="submit" value="上传文件"/>

   </form>

  <body>

   

  </body>

</html>

 

 

Message.jsp--------------servlet执行成功或失败后跳转的页面

<%@ 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%>">

   

    <title>My JSP 'message.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">

    -->

 

  </head>

 

  <body>

   <h2>${message }</h2>

  </body>

</html>

 

原创粉丝点击