• 上传文件


    准备上传页面 upload.html

    //method必须是post的,get不能上传文件
    //enctype="multipart/form-data" 表示提交的数据是二进制文件
    <form action="uploadPhoto" method="post" enctype="multipart/form-data">
    </from>
    
    //提供type="file" 的字段进行上传
    <input type="file" name="filepath" />
    View Code

    讲解上传思路

    1、输入流 

    包含普通项(type="text")和上传项(type="file"),中间通过分割线隔开.

    通过判断可以知道哪些是上传项、哪些是普通项。

    2、当为上传项时

    先在服务器上新建一个文件,然后利用IO流,将这些二进制文件写入服务器上的这个文件中

    核心API

    FileItem

    ——是一个接口,其实现类是DiskFileItem。

    表单中的每个输入项,被封装成一个FileItem对象(即一个Input项对应一个FileItem对象)。

    FileItem item = (FileItem) iter.next();
    
    
    /*1、判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段*/
    //普通表单字段则返回true,否则返回false。
    boolean isFormField();
    
    
    /*2、获取浏览器上传的文件的输入流*/
    InputStream is = item.getInputStream();
    
    
    /*3、获得文件上传字段中的文件名*/
     String getName() ;
    
    
    /*4、返回表单标签name属性的值*/
    String getFieldName() ;
    
    
    /*5、将FileItem对象中保存的数据流内容以一个字符串返回*/
    String getString();
    View Code

    其它操作

    /*1、使用迭代器Iterator遍历集合中的元素*/
    //hasNex()t判断是否有下一个,从空的位置开始遍历
    Iterator iter = items.iterator();
    
    
    /*2、调用getInputStream方法得到数据输入流,从而读取上传数据*/
    InputStream is = item.getInputStream();
    
    
    /*3、根据时间戳创建文件名*/
    filename = System.currentTimeMillis() + ".jpg";
    
    
    /*4、获取当前项目下某个目录文件夹的路径*/
    String photoFolder =request.getServletContext().getRealPath("uploaded");
    
    /*5、在某文件夹下创建新文件*/
    File f = new File(photoFolder, filename);
    f.getParentFile().mkdirs();
    
    
    /*6、复制文件*/
    FileOutputStream fos = new FileOutputStream(f);
    byte b[] = new byte[1024 * 1024];
    int length = 0;
    while (-1 != (length = is.read(b))) {
         fos.write(b, 0, length);
    }
     fos.close();
    View Code

    DiskFileItemFactory

     ——是创建FileItem对象的工厂。

    //1、设置内存缓冲区的大小,默认值为10K。
    //当上传文件大于缓冲区大小时,fileupload组件将使用临时文件缓存上传文件。 
    public void setSizeThreshold(int sizeThreshold);
    View Code

    ServletFileUpload

     ——负责处理上传的文件数据,将表单中的每个输入项,封装成一个FileItem对象。

     ——又称“文件上传解析器”。

    /*1、解析request对象*/
    //并把表单中的每一个输入项包装成一个fileItem 对象
    //并返回一个保存了所有FileItem的list集合。
    List<FileItem>  parseRequest(HttpServletRequest request);
    View Code

    准备 上传功能UploadPhotoServlet的开发

    需要用到两个第三方的jar包,commons-io-1.4.jar和commons-fileupload-1.2.2.jar。

            InputStream is=null;
            Category category=new Category();   //(可略)
            try {
                 DiskFileItemFactory factory = new DiskFileItemFactory();
                 ServletFileUpload upload = new ServletFileUpload(factory);
                 factory.setSizeThreshold(1024 * 10240);
                 
                 List items = upload.parseRequest(request);
                 Iterator iter = items.iterator();
                 while (iter.hasNext()) {
                     FileItem item = (FileItem) iter.next();
                     if (!item.isFormField()) {/*该字段为上传文件字段*/
                         is = item.getInputStream();
                         /*实现文件的上传*/
                         String imageFolder =request.getServletContext().getRealPath("img/category");  //此处可灵活修改成自己想要的保存目录
                         String filename = category.getId()+".jpg";//此处可灵活修改成自己想要的命名方式
                         File f = new File(imageFolder, filename);
                        
                         FileOutputStream fos = new FileOutputStream(f);
                                 byte b[] = new byte[1024 * 1024];
                                 int length = 0;
                                 while (-1 != (length = is.read(b))) {
                                        fos.write(b, 0, length);
                                  }
                                 fos.flush(); 
                                  /*下面代码,把图片文件保存成jpg格式(ImageUtil是一个自定义的工具类,可到“常用工具类”中去查看)*/
                                 BufferedImage img = ImageUtil.change2jpg(f);
                                 ImageIO.write(img, "jpg", f);  
                         
                     }else{//普通字段,(可略)
                         String paramName = item.getFieldName();
                                 String paramValue = item.getString();
                                 paramValue = new String(paramValue.getBytes("ISO-8859-1"), "UTF-8");
                         //完成一条数据的插入
                          category.setName(paramValue);
                          new CategoryDAO().add(category);
                     }
                 }
            } catch (Exception e) {
                // TODO: handle exception
            }
            response.sendRedirect("categoryList");  //(可略)
        }
    View Code

    这里有两个bug要注意

    1、在编辑页面修改了文件图片,返回列表显示页面时,如果发现原先上传的图片还是没有改变,刷新页面即可看到编辑后的文件图片。

    2、设置上传文件保存路径在当前项目的img/category下,当时img/category文件夹下为空,列表显示页面有文件图片显示,

    可在相关servlet类中System.out.println(file);把文件上传路径打印出来。

  • 相关阅读:
    TCP IP基础知识的复习
    Design Pattern: Singleton 模式
    解决Win7下安装VS2010不显示序列号框的两种方法
    字典树(Trie tree)
    在VS如何查看汇编代码
    使用模板实现编译期间多态
    一段c++代码小例子
    C++ 虚函数表解析
    C++问题:if( input.rdstate() & std::ios::failbit )
    Design Pattern: Adapter 模式 Class Adapter
  • 原文地址:https://www.cnblogs.com/Strugglinggirl/p/12916005.html
Copyright © 2020-2023  润新知