文件上传

文件上传jsp文件如下

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="net.sf.json.JSONObject" %>
<%@ page import="org.apache.commons.fileupload.FileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%
    String rootPath;
    /*按照文件上传的时间,设置文件上传的地址*/
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");//设置日期格式

    String[] data = df.format(new Date()).split(" ");//将字符串转化成字符数组 
    String delemeter = System.getProperties().getProperty("file.separator"); //获取文件分隔符
    String dayindex = data[0].replace("-",delemeter);将yyyy-MM-dd转为 yyyy/MM/dd
    String timeindex = data[1].replace(":", "").replace(".", delemeter);将HH:mm:ss.SSS转化为HH/mm/ss/SSS
    String daypath = delemeter + "upload" +delemeter+ dayindex + delemeter + timeindex +delemeter;//上传文件的存储路径

    JSONObject json = new JSONObject();

    String realPath = request.getSession().getServletContext().getRealPath("/");// 获取的是Servlet容器对象,相当于tomcat容器了。getRealPath("/") 获取实际路径,“/”指代项目根目录,所以代码返回的是项目在容器中的实际发布运行的根路径
    String filetmpname = (String)request.getParameter("filename");//获取文件名字

    realPath = realPath.substring(0,realPath.lastIndexOf(delemeter));//截取从0到最后一个‘/’不包括‘/’的字符,
    //创建文件的保存目录
    rootPath = realPath + daypath;

    //创建保存路径的文件名
    String fileName = rootPath + filetmpname;

    // 验证上传内容了类型
    String contentType = request.getContentType();//Returns the MIME type of the body of the request, or null if the type is not known
    if ((contentType.indexOf("multipart/form-data") >= 0)){
        try {
            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);

            upload.setSizeMax(10*1024*1024);

            List<FileItem> list = upload.parseRequest(request);
            Iterator<FileItem> iter = list.iterator();
            while (iter.hasNext()) {
                FileItem item = iter.next();
                //item.isFormField()用来判断当前对象是否是file表单域的数据  如果返回值是true说明不是 就是普通表单域
                if (!item.isFormField()) {
                    File file = new File(rootPath);
                    if (!file.exists() && !file.isDirectory()) {//文件目录不存在创建目录
                        file.mkdirs();
                    }

                    File checkFile = new File(fileName);
                    if (checkFile.exists()) {
                        out.println("<exist>" + filetmpname + "文件已经存在.</exist>");
                    }
                    if (!checkFile.exists()) {
                        checkFile.createNewFile();
                        checkFile.setExecutable(true);
                        checkFile.setReadable(true);
                        checkFile.setWritable(true);
                    }

                    item.write(checkFile);
                    json.put("success", "上传文件成功");
                    json.put("filename", filetmpname);
                    json.put("path", daypath);
                    out.println(json);
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
            json.put("success", "上传文件失败");
            out.println(json);
        }
    }
    else {
        json.put("success", "不是支持的文件");
        out.println(json);
    }
%>

  主要使用Commons-fileupload.jar中的类,FileItem-------DiskFileItemFactory-----ServletFileUpload 

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

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

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

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

迭代器(Iterator)

  迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

  Java中的Iterator功能比较简单,并且只能单向移动:

  (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

  (2) 使用next()获得序列中的下一个元素。

  (3) 使用hasNext()检查序列中是否还有元素,如果仍有元素可以迭代,则返回 true

  (4) 使用remove()将迭代器新返回的元素删除。

  Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

迭代器就是把不同的数据结构 "相同功能 "的函数装到一个名字相同的函数里,这样的话你在写算法的时候就可以不管你要操作的数据结构的逻辑结构了。

迭代器是:
无论你用的是什么结构(链表也好、数组也好、数也好、图也好、hash表也好),总之, 你可以不关心任何细节遍历细节, 从一个起点(begin)触发到达,到达终点(end),并且保证每个节点都能走到且只走一次。

 

posted @ 2015-10-26 13:59  LJJ洁儿  阅读(228)  评论(0编辑  收藏  举报