zoukankan      html  css  js  c++  java
  • Servlet文件上传(ServletFIleUpload,DiskFileItemFactory,FileItem)

    1:我们学的是表单文件上传,就是在一个FORM中提交相应的信息,和之前我们的提交的注册信息之类的表单是不同的,所以要先改变一下FORM的属性,enctype="multipart/form-data“,这个属性告诉服务器,我们是要提交文件了,而不是一个表单。
    在服务器端也需要判断下
    boolean isUpload = ServletFileUpload.isMultipartContent(request);
    判断请求中是否有这种标示。

    2:<input type=“file” />这是表单中用来选择上传文件用的,在表单中有这个元素后,会会自动生成一个输入框和一个按钮,作用和awt中的FileDialog类的作用蛮像的。

    3:我们主要使用Commons-fileupload.jar中的类,commons-io是提供流服务用的,我们没有对它进行操作。
    主要使用的如下:

    FileItem-------DiskFileItemFactory-----ServletFileUpload 

    作用:
    FileItem 用来封装表单中的元素和数据。

    ServletFileUpload 处理表单数据,将数据封装到 FileItem 对象中。

    DiskFileItemFactory FileItem 对象的工厂,可以设定缓冲区大小和存放临时文件目录。

    ServletFileUpload 处理上传的文件的数据,优先保存在缓冲区,如果数据超过了缓冲区大小,则保存到硬盘上,存储在DiskFileItemFactory指定目录下的临时文件。数据都接收完后,它再在从临时文件中将数据写入到上传文件目录下的指定文件中,并删除临时文件。

    4:几个小功能

    限制上传文件的大小 
    long MAXSIZE=1024*1024*3; 单位是byte,所以这里指定的是3M
    upload.setFileSizeMax(MAXSIZE);

    设定临时目录
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(1024*1024); 设定了1M的缓冲区
    factory.setRepository(new File("E:/temp")); 设置上传文件的临时目录
    如果上传的文件小于1M,那么文件就在缓冲区中,然后写入硬盘,不经过缓冲区。这样也就不用硬盘的读写了,应该比较快。

    定义服务器能接受的文件类型。
    String[] allowTypes = new String[]{"jpg","jpeg"};
    用数组定义可接受文件的后缀名,在读取表单内容后,取得客户端上传文件的全名,再截取后缀名,取到最后一个.的下标,再拿到之后所有的字符串:
    String endName= fileName.substring(fileName.lastIndexOf(".")+1);
    用数组遍历,如果不在数组中有定义,那么就不接受。
    throw new RuntimeException("文件类型["+endName+"],不支持");

    最基本的代码实现:
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    try { 
    List<FileItem> items = upload.parseRequest(request); //解析request请求
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    if (item.isFormField()) { //如果是表单域 ,就是非文件上传元素 
    String name = item.getFieldName(); //获取name属性的值
    String value = item.getString(); //获取value属性的值
    } else { 
    String fieldName = item.getFieldName(); //文件域中name属性的值
    String fileName = item.getName(); //文件的全路径,绝对路径名加文件名 
    String contentType = item.getContentType(); //文件的类型
    long size = item.getSize(); //文件的大小,以字节为单位 
    File saveFile = new File("D:/test.jpg"); //定义一个file指向一个具体的文件
    item.write(saveFile); //把上传的内容写到一个文件中

    }

    common-fileupload组件
    下载地址:http://jakarta.apache.org/commons/fileupload/
    下载后解压zip包,将commons-fileupload-1.0.jar复制到tomcat的webapps你的webappWEB-INFlib下

    Create a servlet
    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import org.apache.commons.fileupload.*;

    public class Upload extends HttpServlet {

    private String uploadPath = "C:\upload\"; // 用于存放上传文件的目录
    private String tempPath = "C:\upload\tmp\"; // 用于存放临时文件的目录

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
    try {
    DiskFileUpload fu = new DiskFileUpload();
    // 设置最大文件尺寸,这里是4MB
    fu.setSizeMax(4194304);
    // 设置缓冲区大小,这里是4kb
    fu.setSizeThreshold(4096);
    // 设置临时目录:
    fu.setRepositoryPath(tempPath);

    // 得到所有的文件:
    List fileItems = fu.parseRequest(request);
    Iterator i = fileItems.iterator();
    // 依次处理每一个文件:
    while(i.hasNext()) {
    FileItem fi = (FileItem)i.next();
    // 获得文件名,这个文件名包括路径:
    String fileName = fi.getName();
    if(fileName!=null) {
    // 在这里可以记录用户和文件信息
    // ...
    // 写入文件a.txt,你也可以从fileName中提取文件名:
    fi.write(new File(uploadPath + "a.txt"));
    }
    }
    // 跳转到上传成功提示页面
    }
    catch(Exception e) {
    // 可以跳转出错页面
    }
    }
    }

    //当servlet收到浏览器发出的Post请求后,在doPost()方法中实现文件上传。以下是示例代码:


    如果要在配置文件中读取指定的上传文件夹,可以在init()方法中执行:

    public void init() throws ServletException {
    uploadPath = ....
    tempPath = ....
    // 文件夹不存在就自动创建:
    if(!new File(uploadPath).isDirectory())
    new File(uploadPath).mkdirs();
    if(!new File(tempPath).isDirectory())
    new File(tempPath).mkdirs();
    }

    配置servlet,用记事本打开tomcatwebapps你的webappWEB-INFweb.xml源码天空,没有的话新建一个。典型配置如下:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    <servlet>
    <servlet-name>Upload</servlet-name>
    <servlet-class>Upload</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>Upload</servlet-name>
    <url-pattern>/fileupload</url-pattern>
    </servlet-mapping>
    </web-app>

    配置好servlet后,启动tomcat,写一个简单的html测试:

    <form action="fileupload" method="post" enctype="multipart/form-data" name="form1">
    <input type="file" name="file">
    <input type="submit" name="Submit" value="upload">
    </form>

    注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。

  • 相关阅读:
    windows 按时自动化任务
    Linux libusb 安装及简单使用
    Linux 交换eth0和eth1
    I.MX6 GPS JNI HAL register init hacking
    I.MX6 Android mmm convenient to use
    I.MX6 GPS Android HAL Framework 调试
    Android GPS GPSBasics project hacking
    Python windows serial
    【JAVA】别特注意,POI中getLastRowNum() 和getLastCellNum()的区别
    freemarker跳出循环
  • 原文地址:https://www.cnblogs.com/zhwl/p/3623942.html
Copyright © 2011-2022 走看看