第六章 JSP开发业务应用

用Commons-FileUpload.jar 包实现文件上传
  实现文件上传,涉及对文件的读写操作,实现起来需要编写大量的代码,并容易引发异常。幸运的是
        目前有很多非常实用的文件上传工具,可以帮助我们实现文件上传的功能,其中应用比较比较多的是Commons-FileUpload组件,使用该组件可以极大的简化开发人员的编码工作量
Commons是Apache开放源代码组织的一个java子项目,该项目主要涉及一些开发中常用的模块,如文件上传、命令行处理、数据库连接池等。FileUpload 就是其中的一个用于处理HTTP文件上传的子项目
Commons-FileUpload组件具有以下几个特点:
--》使用简单:Commons-FileUpload组件可以方便地嵌入JSP文件中,在JSP文件中仅编写少量代码即可完成文件上传的功能,十分方便
--》能够全程控制上传内容:使用Command-FileUpload组件提供的对象和操作方法,可以获得全部上传文件的信息,包括文件名称、类型、大小等、方便操作
表单的属性设置:
文件上传时,需要在表单属性中添加属性enctype ,该属性用于设置表单提交数据的编码方式。
由于文件传至服务器时与一般的文本类型的编码方式不同,它需要使用multipart/form-data编码方式
 <body>
    <form action="doupload.jsp" method="post" enctype="multipart/form-data">
       <p>姓名:<input type="text" name="user" value="林建辉"></p>
       <div id="imgFileDiv">
            <span id="addFile"><a href="#">批量上传图片</a></span>
            <p>选择图片:<input type="file" name="nfile"></p>
            <p> <input type="submit" name="提交"></p>
       </div>
    </form>
  </body> 
注意:上传文件时,form标签的method属性必须取值为post 不能为get
表单的enctype属性有以下三个值:
application/x-www-form-urlencoded :表示默认值
          作用:用于处理少量文本数据的传递,在想服务器发送大量的文件包含非ASCII字符的文本或二进制数据时效率很低
multipart/form-data:上传二进制数据
   只有使用了multipart/form-data才能完整地传递文件数据,进行上传操作
    text/plain:
       主要用于向服务器传递大量文本数据,比较使用于电子邮件的应用
<%@ page import="javax.servlet.jsp.tagext.TryCatchFinally"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
    <%
        request.setCharacterEncoding("UTF-8");
          String uploadFileName="";//上传的文件名
          String fieldName="";//表单字段元素的name属性
          //请求信息中的内容是否是multipart类型,然后把请求对象作为参数穿进去
         boolean isMultipart=ServletFileUpload.isMultipartContent(request);
         //上传文件的存储路径(绝对路径
 String uploadFilePath               =request.getSession().getServletContext().getRealPath("upload/");
          if(isMultipart){//因为我要上传二进制文件,所以必须要判断
             FileItemFactory factory=new DiskFileItemFactory();
             ServletFileUpload upload=new ServletFileUpload(factory);
                          upload.setSizeMax(1024*1024)//控制文件上传的大小 这一行可不写
             try{
               //解析form表单中所有的文件
               List<FileItem> items=upload.parseRequest(request);
                 Iterator<FileItem> ite=items.listIterator();
               while(ite.hasNext()){//循环迭代每个文件
                  FileItem item=ite.next();
                  if(item.isFormField()){//判断是否为普通表单字段元素
                     fieldName=item.getFieldName();//表单字段元素的name属性
                     if(fieldName.equals("user")){
                          //输出表单字段的值
                          out.print(item.getString("utf-8")+"上传了文件.<br/>");
                     }
                  }else{
                         //否则为文件表单字段元素
                        fileName=item.getName();
                     if(fileName!=null && !fileName.equals("")){
                         File fullFile=new File(fileName);
                         File saveFile=new File(uploadFilePath,fullFile.getName());
                         item.write(saveFile);
                         uploadFileName=fileName;
                         out.print("上传文件成功后的文件名是:"+uploadFileName);
                     }
                  }
               }
                       
             }catch(Exception e){
                e.printStackTrace();
             }
          }
    %>
</body>
</html>
ServletFileUpload 类
public void setSizeMax(long sizeMax)  设置请求消息实体内容的最大允许的字节数
public List parseRequest(HttpServletRequest request)
   解析form表单的每一个字符的数据,返回一个FileItem对象 List集合
public static final boolean isMultipartContext(HttpServletRequest request)
       判断请求信息的内容是否是"multipart/form-data"类型
public void setHeaderEncoding(String encoding)
       设置转换时所使用的字符集编码

FileItem 接口
FileItem 是一个接口用于封装单个表单字段元素的数据,一个表单字段元素对应一个FileItem对象
在应用程序中使用的是接口的实现类DiskFileItem类,FileItem接口提供的常用方法:
public boolean isFormField()
         判断FileItem对象封装的数据类型 普通表单字段返回true,文件表单字段返回false
public Stirng getName() 
      获得文件上传字段中的文件名,普通表单字段返回null
public String getFiledName()
            返回表单字段的name 属性值
public void write(File file)
           将FileItem对象中的主体内容保存到指定的文件中
public String getString(String encoding)
          将FileItem对象中保存的主体内容以一个字符串的形式返回。
public long getSize()
         返回单个上传文件的字节数
FileItemFactory 接口与实现类
ServletFileUpload 对象的创建需要依赖于FileItemFactory 工厂,将获得的上传文件FileItem对象
 保存至服务器硬盘。FileItemFactory接口的实现类是DiskFileItemFactory
public void setSizeThreshold(int size)-------Size Threshold 门限
                     设置内存缓存区的大小
public void setRepositotyPath(String path)------repository 仓库--贮藏室
                        设置临时文件存放的目录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值