文件的上传(1)

来源:互联网 发布:除了暴风影音知乎 编辑:程序博客网 时间:2024/06/07 04:58
 

11,11,23

文件的上传

一、文件上传概述

1、  实现web开发中的文件上传功能,需完成如下两步操作:

(1)       在web页面中添加上传输入项(JSP页面或html页面)。

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

2、  如何在web页面中添加上传输入项?

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

1)必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。

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

3、  如何在Servlet中读取文件上传数据,并保存到本地硬盘中?

1)    Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作,示例。

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

4、  使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。

二、文件上传实例:

文件上传页面。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%>">

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

  </head>

  <body>

     <form action="${pageContext.request.contextPath}/servlet/UploadServlet" 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>

      <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>

</html>

在com.hbsi.servlet包下,创建servlet类。实现文件上传。

package com.hbsi.servlet;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

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;

public class UploadServlet2 extends HttpServlet {

 

       public void doGet(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

              doPost(request, response);

       }

       public void doPost(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

              // 文件的上传

              try {

                     // (1)创建一个工厂对象-----FileItem对象

                     DiskFileItemFactory factory = new DiskFileItemFactory();

                     // (2)得到解析器

                     ServletFileUpload upload = new ServletFileUpload(factory);

                     //解决上传文件的乱码问题

                     upload.setHeaderEncoding("utf-8");

                     // (3)对请求进行解析,有几个输入项,就有几个FileItem对象

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

                     //对list集合中的元素进行讨论,增强的for循环

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

                     for(FileItem item:list){

                            //(1)判断输入项的类型

                            if(item.isFormField()){

                                   //普通输入项

                                   String inputName=item.getFieldName();

                                   //解决输入的中文乱码问题

                                   String inputValue=item.getString("utf-8");

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

                            }else{

                                   //上传文件的输入项

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

                                   filename=filename.substring(filename.lastIndexOf("\\")+1);//为了得到上传文件的文件名

                                  

                                   InputStream is=item.getInputStream();

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

                                   //从输入流中读取数据

                                   byte[] buff=new byte[1024];

                                   int len=0;

                                   while((len=is.read(buff))>0){

                                          fos.write(buff,0,len);

                                   }

                                   is.close();

                                   fos.close();

                            }

                            DiskFileItemFactory  factory1 = new DiskFileItemFactory();

                            factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));

                            FileItem item1;

                            item.delete();

                     }

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

              } catch (FileUploadException e) {

                     e.printStackTrace();

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

              }

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

       }

}

原创粉丝点击