zoukankan      html  css  js  c++  java
  • 使用Apache Commons-fileupload组件上传文件案例

    文件上传,说到底还是使用http协议。这里最主要是做两件事,一是客户端上传,二是服务器接收。

    先说客户端上传:

    在web页面中,使用form表单提交给服务器,注意form表单的input项中一定要写name属性,否则不会上传,还有一个form属性就是将

    enctype属值设为multipart/form-data。如下

     <form action="/fileUpload/servlet/fiveup" method="post" enctype="multipart/form-data"><br>
        文件1:<input type="file" name="fileone"/><br>
        文件2:<input type="file" name="filetwo"/><br>
        文件3:<input type="file" name="filethree"/><br>
        文件4:<input type="file" name="filetfour"/><br>
        文件5:<input type="file" name="filefive"/><br>
        <input type="submit" value="上传">
        </form>

    好,客户端的用一个html页面写好就可以了。接下来说服务器端

    服务器端使用servlet接收,这里我们使用Apache 开源组织提供的一个用来处理表单文件上传的一个开源组件( Commons-fileupload );使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。故先要导入两个jar包哟。好,看代码吧。代码中有涉及到Commons-fileupload API的使用,想要了解可以查看Apache Commons-fileupload的API文档。

    基本步骤是这样的:

    1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录

    2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。

    3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。

    4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件

    package com.lam.upload;
    
    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.ServletContext;
    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 FiveUp extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            // Create a factory for disk-based file items
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // Configure a repository (to ensure a secure temp location is used)
            ServletContext servletContext = this.getServletConfig().getServletContext();
            File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
            factory.setRepository(repository);
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setHeaderEncoding("utf-8");
            // Parse the request
            try {
                List<FileItem> items = upload.parseRequest(request);
                for (FileItem item : items) {
                    if(item.isFormField()){//如果只是表单中信息,不是表单文件
                        String fieldName = item.getFieldName();
                        String fieldValue = item.getString();
                        out.print("<br>fieldName=="+fieldName+",--fieldValue=="+fieldValue);
                    }else{
                        InputStream inputStream = item.getInputStream();
                        //得到保存文件的路径
                        String realpath=request.getRealPath("WEB-INF/fiveUpload");
                        File filedir =new File(realpath);
                        if(!filedir.exists()){
                            filedir.mkdirs();
                        }
                        //得到上传的文件的名字
                        String fileName = item.getName();
                        out.print("<br>上传的文件名:=="+fileName);
                        File file=new File(realpath+"/"+fileName);
    //                    String saveName=realpath+"/"+fileName;
                        FileOutputStream fos=new FileOutputStream(file);
                        byte[] bytes= new byte[1024];
                        int len=0;
                        //写入文件
                        while((len=inputStream.read(bytes))!=-1){
                            fos.write(bytes, 0, len);
                        }
                        inputStream.close();
                        fos.close();
                        out.print("<h1>"+fileName+"文件上传成功</h1>");
                    }
                }
                
                
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
    
        }
    
    }

    这里说一个需要注意的问题

    在IE6或者IE8或者myeclipse中的内置浏览器以及其他浏览器中,会出现上传文件的文件名带有绝对路径的。而不是单单只有文件名
    commons-fileupload的源码中注释有些,对于一些浏览器有出现文件名带路径名的情况,这个时候就需要自己分割文件名了。
    源代码中也有注释写明:


  • 相关阅读:
    【C#语言规范版本5.0学习】1.5类和对象(一)
    【C#语言规范版本5.0学习】1.5类和对象(二、类的方法)
    【C#语言规范版本5.0学习】1.4语句
    mac 安装docker
    Laravel 操作指令
    php 查看接口运行时间
    MySql 按日期条件查询数据
    Laravel操作上传文件的方法
    统计数据表中某个字段的值大于2条的数据
    循环中合并数组
  • 原文地址:https://www.cnblogs.com/linchaohao/p/5189082.html
Copyright © 2011-2022 走看看