`
OracleX
  • 浏览: 124203 次
  • 性别: Icon_minigender_1
  • 来自: 地球
社区版块
存档分类
最新评论

图片上传源码(commons-fileupload-1.2.2)分析

阅读更多

 

题记:文章是供自己查看方便,所以没有进行格式化,请见谅!

第一步:生成DiskFileItemFactory

 

 

 

 

 

DiskFileItemFactory factory = new DiskFileItemFactory();

 /**

     * Constructs an unconfigured instance of this class. The resulting factory

     * may be configured by calling the appropriate setter methods.

     */

    public DiskFileItemFactory() {

        this(DEFAULT_SIZE_THRESHOLDnull);

    }

 

 

 /**

     * Constructs a preconfigured instance of this class.

     *

     * @param sizeThreshold The threshold, in bytes, below which items will be

     *                      retained in memory and above which they will be

     *                      stored as a file.

     * @param repository    The data repository, which is the directory in

     *                      which files will be created, should the item size

     *                      exceed the threshold.

     */

    public DiskFileItemFactory(int sizeThreshold, File repository) {

        this.sizeThreshold = sizeThreshold;

        this.repository = repository;

    }

向diskFileItemFctory指定参数

// 设置最多只允许在内存中存储的数据,单位:字节

factory.setSizeThreshold(4096);

// 设置一旦文件大小超过getSizeThreshold()(默认10kb)的值时数据存放在硬盘的目录

factory.setRepository(new File("d:\\temp"));

/**

     * Sets the directory used to temporarily store files that are larger

     * than the configured size threshold.

     *

     * @param repository The directory in which temporary files will be located.

     *

     * @see #getRepository()

     *

     */

    public void setRepository(File repository) {

        this.repository = repository;

    }

 

第二步:生成ServletFileUpload

 

 

 

 

 

根据第一步得到的factory生成servletFileUpload对象

    /**

     * Constructs an instance of this class which uses the supplied factory to

     * create <code>FileItem</code> instances.

     *

     * @see FileUpload#FileUpload()

     * @param fileItemFactory The factory to use for creating file items.

     */

    public ServletFileUpload(FileItemFactory fileItemFactory) {

        super(fileItemFactory);

    }

 

向servletFileUpload对象指定参数

// 设置允许用户上传文件大小,单位:字节,这里设为1m  值为-1没有大小限制

sevletFileUpload.setSizeMax(1 * 1024 * 1024);

 /**

     * Sets the maximum allowed size of a complete request, as opposed

     * to {@link #setFileSizeMax(long)}.

     *

     * @param sizeMax The maximum allowed size, in bytes. The default value of

     *   -1 indicates, that there is no limit.

     *

     * @see #getSizeMax()

     *

     */

    public void setSizeMax(long sizeMax) {

        this.sizeMax = sizeMax;

    }

第三步:通过servletFileUpload读取request上传信息

List fileItems = sevletFileUpload.parseRequest(req);

 

 /**

     * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>

     * compliant <code>multipart/form-data</code> stream.

     *

     * @param request The servlet request to be parsed.

     *

     * @return A list of <code>FileItem</code> instances parsed from the

     *         request, in the order that they were transmitted.

     *

     * @throws FileUploadException if there are problems reading/parsing

     *                             the request or storing files.

     */

    public List /* FileItem */ parseRequest(HttpServletRequest request)

    throws FileUploadException {

        return parseRequest(new ServletRequestContext(request));

    }

第四步:将读取的信息写入到指定目录

item.write(new File(     D:/WorkSpace/BlogV1.4/WebContent/uploadImages/"+ m.group(1)));

 

 

/**

     * A convenience method to write an uploaded item to disk. The client code

     * is not concerned with whether or not the item is stored in memory, or on

     * disk in a temporary location. They just want to write the uploaded item

     * to a file.

     * <p>

     * This implementation first attempts to rename the uploaded item to the

     * specified destination file, if the item was originally written to disk.

     * Otherwise, the data will be copied to the specified file.

     * <p>

     * This method is only guaranteed to work <em>once</em>, the first time it

     * is invoked for a particular item. This is because, in the event that the

     * method renames a temporary file, that file will no longer be available

     * to copy or rename again at a later time.

     *

     * @param file The <code>File</code> into which the uploaded item should

     *             be stored.

     *

     * @throws Exception if an error occurs.

     */

    public void write(File file) throws Exception {

        if (isInMemory()) {

            FileOutputStream fout = null;

            try {

                fout = new FileOutputStream(file);

                fout.write(get());

            } finally {

                if (fout != null) {

                    fout.close();

                }

            }

        } else {

            File outputFile = getStoreLocation();

            if (outputFile != null) {

                // Save the length of the file

                size = outputFile.length();

                /*

                 * The uploaded file is being stored on disk

                 * in a temporary location so move it to the

                 * desired file.

                 */

                if (!outputFile.renameTo(file)) {

                    BufferedInputStream in = null;

                    BufferedOutputStream out = null;

                    try {

                        in = new BufferedInputStream(

                            new FileInputStream(outputFile));

                        out = new BufferedOutputStream(

                                new FileOutputStream(file));

                        IOUtils.copy(in, out);

                    } finally {

                        if (in != null) {

                            try {

                                in.close();

                            } catch (IOException e) {

                                // ignore

                            }

                        }

                        if (out != null) {

                            try {

                                out.close();

                            } catch (IOException e) {

                                // ignore

                            }

                        }

                    }

                }

            } else {

                /*

                 * For whatever reason we cannot write the

                 * file to disk.

                 */

                throw new FileUploadException(

                    "Cannot write uploaded file to disk!");

            }

        }

    }

 

 

 

附后台实现部分代码:

@Override

 protected void doPost(HttpServletRequest req, HttpServletResponse resp)

   throws ServletException, IOException {

  resp.setContentType("text/html; charset=GB2312");

  PrintWriter out = resp.getWriter();

  HttpSession session = req.getSession();

  session.setMaxInactiveInterval(20);

  String submit = (String) session.getAttribute("submit");

  String flag = req.getParameter("flag");

  if (flag != null && flag.equals("ajax")) {

   if (submit != null) {

    out.print("重复提交");

   }

  else {

 

   AlbumService as = new AlbumService();

   // submit=null代表第一次提交,不为null代表重复提交

   if (submit == null) {

    try {

     DiskFileItemFactory factory = new DiskFileItemFactory();

     // 设置最多只允许在内存中存储的数据,单位:字节

     factory.setSizeThreshold(4096);

     // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录

     factory.setRepository(new File("d:\\temp"));

     ServletFileUpload sevletFileUpload = new ServletFileUpload(

       factory);

     // 设置允许用户上传文件大小,单位:字节,这里设为2m  值为-1没有大小限制

     sevletFileUpload.setSizeMax(1 * 1024 * 1024);

     // 开始读取上传信息

     List fileItems = sevletFileUpload.parseRequest(req);

     // 依次处理每个上传的文件

     Iterator iter = fileItems.iterator();

     // 正则匹配,过滤路径取文件名

     String regExp = ".+\\\\(.+)$";

     // 过滤掉的文件类型

     String[] errorType = { ".exe"".com"".cgi"".asp" };

     Pattern p = Pattern.compile(regExp);

     while (iter.hasNext()) {

      FileItem item = (FileItem) iter.next();

      // 忽略其他不是文件域的所有表单信息

      if (!item.isFormField()) {

       String name = item.getName();

       long size = item.getSize();

       if ((name == null || name.equals("")) && size == 0)

        continue;

       Matcher m = p.matcher(name);

       boolean result = m.find();

       if (result) {

        for (int temp = 0; temp < errorType.length; temp++) {

         if (m.group(1).endsWith(errorType[temp])) {

          throw new IOException(name

            ": 非法文件类型禁止上传");

         }

        }

        try {

         // 保存上传的文件到指定的目录

         // 在下文中上传文件至数据库时,将对这里改写开始

         item.write(new File(

           "D:/WorkSpace/BlogV1.4/WebContent/uploadImages/"

             + m.group(1)));

         as.uploadAlbum(m.group(1),

           req.getContextPath()

             "/uploadImages/");

         out.print(name + "  " + size

           "<br>");

         // 在下文中上传文件至数据库时,将对这里改写结束

        catch (Exception e) {

         out.println(e);

        }

       else {

        throw new IOException("fail to upload");

       }

      }

     }

    catch (IOException e) {

     out.println(e);

 

    catch (FileUploadException e) {

     out.println(e);

    }

    // 最后把session中的值置为false,表示对表单提交做过操作

    session.setAttribute("submit""submit");

    List<AlbumBean> albumList = as.getAlbumList();

    req.setAttribute("albumList", albumList);

    req.getRequestDispatcher("/albumList.jsp").forward(req, resp);

   else {

    out.print("重复提交");

   }

  }

 

 }

}

 

分享到:
评论

相关推荐

    commons-fileupload-1.2.2

    commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-...

    commons-fileupload-1.2.2+commons-io-2.4+源码+帮助文档

    在实际开发中,Apache Commons FileUpload和Commons IO结合使用,可以高效、安全地处理文件上传。它们是Java Web开发者处理文件上传问题的得力工具。同时,配合帮助文档,开发者可以更深入理解这两个库的功能和使用...

    commons-fileupload-1.2.2-bin.zip

    - `commons-fileupload-1.2.2.jar`: 主库文件,包含了所有实现文件上传功能的类和方法。 - `LICENSE`: 该库的许可文件,详细说明了使用和分发的条款。 - `NOTICE`: 关于库中使用到的其他开源组件的信息和版权声明。 ...

    jar包 commons-fileupload-1.2.2.jar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    使用commons-fileupload-1.2.2和jquery的progressbar实现的进度条

    本篇将讨论如何使用Apache Commons FileUpload 1.2.2库和jQuery的progressbar插件来实现这样的功能。 Apache Commons FileUpload是一个Java库,专门处理HTTP请求中的多部分形式数据,即通常用于上传文件的数据格式...

    commons-fileupload文档及源代码.rar

    源代码包`commons-fileupload-1.2.2-src.zip`包含了库的所有源代码,你可以深入学习其实现细节,了解如何解析多部分请求,如何管理内存和磁盘资源,以及如何处理文件上传过程中的异常。 **六、文档解读** `common_...

    org.apache.commons 常用jar 以及部分源码

    commons-fileupload-1.2.1.jar commons-discovery-0.2.jar commons-digester-1.6.jar commons-dbcp-1.2.2.jar commons-collections-3.2.1.jar commons-codec-1.3.jar commons-chain-1.1.jar commons-beanutils-1.6....

    javaweb开发jar包集锦 jar包+源码

    javaweb开发jar包打包下载 jar包+源码 1、c3p0-0.9.1.2 2、commons-beanutils-1.8.3-bin 3、commons-dbcp-1.4-bin 4、commons-fileupload-1.2.2-bin 5、commons-dbcp-1.4-bin

    用servlet写的文件上传及下载功能带进度条

    主要用到两个jar:commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar 内容介绍: com.fm.FileManagerService:一个servlet用来实现主要的文件上传下载逻辑的 com.fm.MyPreogressListener:一个进度监听类,用来做...

    基于SpringMVC+Hibernate4的考勤管理系统+.zip

    commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-logging-1.1.3.jar dom4j-1.6.1.jar hibernate-commons-annotations-4.0.5.Final.jar hibernate-core-4.3.11.Final.jar hibernate-entitymanager-4.3.11...

    ueditor基本配置、图片上传配置、文件上传配置

    1. **依赖库**:确保项目包含文件上传所需的库,如`commons-fileupload-1.2.2.jar`。 2. **Uploader类**:在Java源码中创建`Uploader`类,处理图片上传逻辑。 3. **配置`editor_config.js`**:设置`imageUrl`指向...

    java 支持 超大上G , 多附件上传

    在给定的描述中提到了`commons-fileupload-1.2.2`,这是一个非常实用的开源组件,用于处理HTTP协议中的文件上传。同时,还提到了`commons-io-1.4.jar`,这是Apache Commons IO库的一个版本,它提供了一系列与I/O相关...

    SSH 配置实例: Spring 3.1 + Hibernate 4.2 + Struts 2.3

    8. `commons-fileupload-1.2.2.jar` 支持处理HTTP请求中的文件上传。 集成SSH框架时,通常会涉及以下步骤: 1. 配置Spring的bean定义,包括DataSource、SessionFactory、HibernateTemplate或JpaTemplate,以及...

    t淘淘商城项目 商城项目 视频和源码教程 详细

    &lt;commons-fileupload.version&gt;1.3.1&lt;/commons-fileupload.version&gt; &lt;jedis.version&gt;2.7.2 &lt;solrj.version&gt;4.10.3 &lt;!-- 时间操作组件 --&gt; &lt;groupId&gt;joda-time &lt;artifactId&gt;joda-time ${joda-time...

Global site tag (gtag.js) - Google Analytics