Apache commons upload 文件上传

web系统中文件上传经常是必不可以的一部分功能,其实文件上传底层还是使用文件IO实现的,当然我们可以自己写一个文件上传的功能,但是比较复杂,涉及文件IO操作以及Http协议的考虑,写的出来的功能还一定很健全,IT行业更多的会去遵守不重复发明轮子:的原则,Apache 开源组件给我们提供了一个良好的文件上传组件,而且使用已经很普遍。下面我们来看一下,如何使用这个组件实现文件上传。

 

首先我们要从apahce 开源组织网站(org.apache.com)上下载所需要的资料:

 

每一个是文件上传的功能组件,另外一个也是上传所所需要的包。

两上组件都属于是Commons 组件。

里面大家可以找到相关的两具 jar包和对应的API文档。

下面举个例子:

需求:使用upload 组件上传多个文件到服务器端,采用jsp ,servlet 实现。

1.   创建一个Web工程,在WebRoot 目录下创建一个upload.jsp 文件,代表如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>

 

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

<html>

  <head>

    <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="../uploadServlet" method="post" enctype="multipart/form-data">

    usrename:<input type="text" name="username"><br>

    password:<input type="password" name="password"><br>

    file1:<input type="file" name="file1"><br>

    file2:<input type="file" name="file2"><br>

    <input type="submit" value="submit">

   

    </form>

  </body>

</html>

界面显示如下:

 

创建一个显示文件上传结果的页面result.jsp ,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>

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

<html>

  <head>

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

    username:${requestScope.username }<br>

    password:$(requestScope.password)<br>

    file1:${requestScope.file1 }<br>

    file1:${requestScope.file2 }<br>

  </body>

</html>

 

注意JSP文件编码,以防止出现乱码

以及form 表单的属性: method="post" enctype="multipart/form-data">

2.   创建一个UploadSetvlet ,代码如下:

 

package com.snt.struts2.servlet;

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

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;

/**

 * 文件上传如果文件小,上传组件可以将文件存放在内存中,

 * 如果过大时会放在临时目录里面,之后再通过IO流操作

 * @author LEPING LI

 *

 */

@SuppressWarnings("unchecked")

public class UploadServlet extends HttpServlet{

         public void doPost(HttpServletRequest request, HttpServletResponse response)

                            throws ServletException, IOException {

                   request.setCharacterEncoding("UTF-8");

                   //磁盘文件条目工厂

                   DiskFileItemFactory factory=new DiskFileItemFactory();

                    // 文件上传如果文件小,上传组件可以将文件存放在内存中,

                    //如果过大时会放在临时目录里面,之后再通过IO流操作

                   //获取目录真实路径   / 代表 WebRoot目录下面

                   String path=request.getRealPath("/upload");

                   //设置临时目录

                   factory.setRepository(new File(path));

                   //设置上传文件大小

                   factory.setSizeThreshold(1024*1024);

                   //创建一个ServletFileUpload 实例

                   ServletFileUpload sfu=new ServletFileUpload(factory);

                  

                   try {

                            //解析请求,取得FileItem 列表

                            List<FileItem> lis=sfu.parseRequest(request);

                            //循环遍历

                            for(FileItem item:lis){

                                     //判断是否是简单的表单字段

                                     if(item.isFormField()){

                                               String name=item.getFieldName();

                                               String value=item.getString("UTF-8");

                                               request.setAttribute(name, value);

                                     }else{

                                               //取得字段名

                                               String name=item.getFieldName();

                                              

                                               //       取得文件路径名

                                               String value=item.getName();

                                               System.out.println(value);

                                               //为了屏蔽各个浏览器提供的路径不同异常

                                               int start=value.lastIndexOf("//");

                                               //取得文件名

                                               String fileName=value.substring(start+1);

                                               request.setAttribute(name, fileName);

                                              

                                               item.write(new File(path,fileName));   //这句代码与下面高亮显示的代表功能相同

                                               /**

                                               //获取文件输出流

                                               File f=new File(path,fileName);

                                               OutputStream os=new FileOutputStream(f);

                                               //获取文件条目的输入流

                                               InputStream in=item.getInputStream();

                                               byte[] buffer=new byte[400];

                                               int length=0;

                                               //读写文件

                                               while((length=in.read(buffer))>0){

                                                        os.write(buffer,0,length);

                                               }

                                               os.flush();

                                               os.close();

                                               in.close();

                                               */

                                     }

                            }

                   } catch (FileUploadException e) {

                            e.printStackTrace();

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

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

         }

}

 

部署应用程序到tomcat 服务器中,运行测试:

会在部署应用程序中的upload 目录下找到上传的文件.

页面结果如下:

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值