`
高军威
  • 浏览: 182090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

上传进度条显示

阅读更多
1.重写
package com.upload.util;

   
    /**
     * $Id: JakartaMultiPartRequest.java 932009 2010-04-08 17:01:16Z lukaszlenart $
     *
     * Licensed to the Apache Software Foundation (ASF) under one
     * or more contributor license agreements.  See the NOTICE file
     * distributed with this work for additional information
     * regarding copyright ownership.  The ASF licenses this file
     * to you under the Apache License, Version 2.0 (the
     * "License"); you may not use this file except in compliance
     * with the License.  You may obtain a copy of the License at
     *
     *  http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing,
     * software distributed under the License is distributed on an
     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     * KIND, either express or implied.  See the License for the
     * specific language governing permissions and limitations
     * under the License.
     */
    /*Struts 文件上传拦截器接口
     * 
     * 1.拦截所有文件上传的请求
     * 2.一般只需要重写parseRequest这个方法
     * 3.目前实现文件上传进度条
     * 
     * */

    import com.opensymphony.xwork2.inject.Inject;
    import com.opensymphony.xwork2.util.logging.Logger;
    import com.opensymphony.xwork2.util.logging.LoggerFactory;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
    import org.apache.commons.fileupload.RequestContext;
    import org.apache.commons.fileupload.disk.DiskFileItem;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.struts2.StrutsConstants;
import org.apache.struts2.dispatcher.multipart.MultiPartRequest;

    import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.List;
import java.util.Map;

    /***
     * Multipart form data request adapter for Jakarta Commons Fileupload package.
     */
    public class myMultiPartRequest implements MultiPartRequest {
        
        static final Logger LOG = LoggerFactory.getLogger(MultiPartRequest.class);
        
        // maps parameter name -> List of FileItem objects
        protected Map<String,List<FileItem>> files = new HashMap<String,List<FileItem>>();

        // maps parameter name -> List of param values
        protected Map<String,List<String>> params = new HashMap<String,List<String>>();

        // any errors while processing this request
        protected List<String> errors = new ArrayList<String>();
        
        protected long maxSize;

        @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)
        public void setMaxSize(String maxSize) {
            this.maxSize = Long.parseLong(maxSize);
        }

        /***
         * Creates a new request wrapper to handle multi-part data using methods adapted from Jason Pell's
         * multipart classes (see class description).
         *
         * @param saveDir        the directory to save off the file
         * @param request the request containing the multipart
         * @throws java.io.IOException  is thrown if encoding fails.
         */
        public void parse(HttpServletRequest request, String saveDir) throws IOException {
            try {
                processUpload(request, saveDir);
            } catch (FileUploadException e) {
                LOG.warn("Unable to parse request", e);
                errors.add(e.getMessage());
            }
        }

        private void processUpload(HttpServletRequest request, String saveDir) throws FileUploadException, UnsupportedEncodingException {
            for (FileItem item : parseRequest(request, saveDir)) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Found item " + item.getFieldName());
                }
                if (item.isFormField()) {
                    processNormalFormField(item, request.getCharacterEncoding());
                } else {
                    processFileField(item);
                }
            }
        }

        private void processFileField(FileItem item) {
            LOG.debug("Item is a file upload");

            // Skip file uploads that don't have a file name - meaning that no file was selected.
            if (item.getName() == null || item.getName().trim().length() < 1) {
                LOG.debug("No file has been uploaded for the field: " + item.getFieldName());
                return;
            }

            List<FileItem> values;
            if (files.get(item.getFieldName()) != null) {
                values = files.get(item.getFieldName());
            } else {
                values = new ArrayList<FileItem>();
            }

            values.add(item);
            files.put(item.getFieldName(), values);
        }

        private void processNormalFormField(FileItem item, String charset) throws UnsupportedEncodingException {
            LOG.debug("Item is a normal form field");
            List<String> values;
            if (params.get(item.getFieldName()) != null) {
                values = params.get(item.getFieldName());
            } else {
                values = new ArrayList<String>();
            }

            // note: see http://jira.opensymphony.com/browse/WW-633
            // basically, in some cases the charset may be null, so
            // we're just going to try to "other" method (no idea if this
            // will work)
            if (charset != null) {
                values.add(item.getString(charset));
            } else {
                values.add(item.getString());
            }
            params.put(item.getFieldName(), values);
        }

        private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
        final HttpSession session = servletRequest.getSession();
            DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
            ServletFileUpload upload = new ServletFileUpload(fac);
        upload.setProgressListener(new ProgressListener() {
            public void update(long pBytesRead, long pContentLength, int pItems) {
                    int percent = (int) (((float)pBytesRead / (float)pContentLength) * 100);
                    session.setAttribute("percent", percent);
                }
            });
            upload.setSizeMax(maxSize);
            return upload.parseRequest(createRequestContext(servletRequest));
        }

        private DiskFileItemFactory createDiskFileItemFactory(String saveDir) {
            DiskFileItemFactory fac = new DiskFileItemFactory();
            // Make sure that the data is written to file
            fac.setSizeThreshold(0);
            if (saveDir != null) {
                fac.setRepository(new File(saveDir));
            }
            return fac;
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getFileParameterNames()
         */
        public Enumeration<String> getFileParameterNames() {
            return Collections.enumeration(files.keySet());
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getContentType(java.lang.String)
         */
        public String[] getContentType(String fieldName) {
            List<FileItem> items = files.get(fieldName);

            if (items == null) {
                return null;
            }

            List<String> contentTypes = new ArrayList<String>(items.size());
            for (FileItem fileItem : items) {
                contentTypes.add(fileItem.getContentType());
            }

            return contentTypes.toArray(new String[contentTypes.size()]);
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getFile(java.lang.String)
         */
        public File[] getFile(String fieldName) {
            List<FileItem> items = files.get(fieldName);

            if (items == null) {
                return null;
            }

            List<File> fileList = new ArrayList<File>(items.size());
            for (FileItem fileItem : items) {
                fileList.add(((DiskFileItem) fileItem).getStoreLocation());
            }

            return fileList.toArray(new File[fileList.size()]);
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getFileNames(java.lang.String)
         */
        public String[] getFileNames(String fieldName) {
            List<FileItem> items = files.get(fieldName);

            if (items == null) {
                return null;
            }

            List<String> fileNames = new ArrayList<String>(items.size());
            for (FileItem fileItem : items) {
                fileNames.add(getCanonicalName(fileItem.getName()));
            }

            return fileNames.toArray(new String[fileNames.size()]);
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getFilesystemName(java.lang.String)
         */
        public String[] getFilesystemName(String fieldName) {
            List<FileItem> items = files.get(fieldName);

            if (items == null) {
                return null;
            }

            List<String> fileNames = new ArrayList<String>(items.size());
            for (FileItem fileItem : items) {
                fileNames.add(((DiskFileItem) fileItem).getStoreLocation().getName());
            }

            return fileNames.toArray(new String[fileNames.size()]);
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getParameter(java.lang.String)
         */
        public String getParameter(String name) {
            List<String> v = params.get(name);
            if (v != null && v.size() > 0) {
                return v.get(0);
            }

            return null;
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getParameterNames()
         */
        public Enumeration<String> getParameterNames() {
            return Collections.enumeration(params.keySet());
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getParameterValues(java.lang.String)
         */
        public String[] getParameterValues(String name) {
            List<String> v = params.get(name);
            if (v != null && v.size() > 0) {
                return v.toArray(new String[v.size()]);
            }

            return null;
        }

        /** (non-Javadoc)
         * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getErrors()
         */
        public List getErrors() {
            return errors;
        }

        /***
         * Returns the canonical name of the given file.
         *
         * @param filename  the given file
         * @return the canonical name of the given file
         */
        private String getCanonicalName(String filename) {
            int forwardSlash = filename.lastIndexOf("/");
            int backwardSlash = filename.lastIndexOf("\\");
            if (forwardSlash != -1 && forwardSlash > backwardSlash) {
                filename = filename.substring(forwardSlash + 1, filename.length());
            } else if (backwardSlash != -1 && backwardSlash >= forwardSlash) {
                filename = filename.substring(backwardSlash + 1, filename.length());
            }

            return filename;
        }

        /***
         * Creates a RequestContext needed by Jakarta Commons Upload.
         *
         * @param req  the request.
         * @return a new request context.
         */
        private RequestContext createRequestContext(final HttpServletRequest req) {
            return new RequestContext() {
                public String getCharacterEncoding() {
                    return req.getCharacterEncoding();
                }

                public String getContentType() {
                    return req.getContentType();
                }

                public int getContentLength() {
                    return req.getContentLength();
                }

                public InputStream getInputStream() throws IOException {
                    InputStream in = req.getInputStream();
                    if (in == null) {
                        throw new IOException("Missing content in the request");
                    }
                    return req.getInputStream();
                }
            };
        }

    }


2.得到当前进度值
 public String getPercentage()
    {
        HttpSession session = getRequest().getSession();
        int status = (Integer) session.getAttribute("percent");
        setJsonStr(new SwikeResult(status + "").toJson());
        return SUCCESS;
    }


3.前台写个定时器 没过 1秒取一次值,在动态修改dom元素值就Ok
分享到:
评论

相关推荐

    小例子:上传进度条显示

    在IT领域,尤其是在Web开发中,用户界面的交互体验至关重要,而“上传进度条显示”是提高用户体验的一个重要元素。这个小例子旨在实现一个类似CSDN资源上传功能的组件,能够实时显示文件上传的进度,同时具备文件...

    大文件上传 进度条显示 (仿csdn资源上传效果)

    这样,我们就实现了一个类似CSDN资源上传效果的大文件上传系统,包括前端的进度条显示和后端的文件接收。用户可以选择文件,点击上传按钮后,进度条会实时显示上传进度,直到文件完全上传到服务器。

    Extjs+java+swf多文件上传进度条显示项目

    标题中的“Extjs+java+swf多文件上传进度条显示项目”是一个综合性的Web开发实践,涉及到前端的用户界面、后端的数据处理以及文件上传过程中进度反馈的实现。这个项目利用了Extjs库来构建用户界面,Java作为服务器端...

    java struts2实现文件上传进度条显示

    在Java Struts2框架中实现文件上传进度条显示,主要涉及到的技术点包括Struts2的文件上传、Ajax异步通信以及前端进度条组件的使用。下面将详细讲解这些知识点。 首先,Struts2的文件上传功能是通过Struts2提供的`...

    struts2实现上传进度条显示

    在Struts2中实现文件上传进度条显示,主要是通过Ajax技术、监听器和JavaScript来完成的。以下是对这个功能的详细解释: 1. **原理**: - **Ajax**(异步JavaScript和XML)技术允许在不重新加载整个网页的情况下,...

    jquery 上传,批量上传 进度条显示

    当涉及到文件上传,尤其是批量上传和进度条显示时,jQuery 提供了一些强大的插件和方法来实现这些功能。在本篇文章中,我们将深入探讨如何利用 jQuery 实现文件上传,特别是批量上传和进度条显示的技术细节。 首先...

    Layui实现文件上传进度条

    要实现文件上传进度条,我们需要使用到Layui的AjaxUpload组件,该组件可以用来上传文件并显示上传进度。我们可以使用`layui.upload`方法来上传文件,并使用`on`方法来监听上传进度。 例如: ```javascript layui....

    JSP文件上传 支持进度条显示.rar

    "JSP文件上传 支持进度条显示"这个项目是针对JSP环境设计的一个AJAX Web上传程序,它允许用户上传大文件(如单个文件100M),并具有文件上传进度条的可视化功能。以下将详细解析这个项目的知识点: 1. **JSP(Java...

    struts2上传文件进度条显示

    总的来说,Struts2实现文件上传进度条显示需要整合服务器端的进度回调和客户端的进度更新,确保数据的实时同步。同时,为了提高用户体验,应考虑优化大文件上传的性能,如分块上传、断点续传等技术。通过以上步骤,...

    layui文件上传带进度条显示.zip

    本资源"layui文件上传带进度条显示.zip"结合了`layui`与`PHP`,实现了文件上传过程中带有进度条的交互效果,提升了用户体验。 首先,我们要理解`layui`的文件上传组件是如何工作的。`layui`的上传组件基于HTML5的`...

    jsp+JQuery多文件上传进度条显示(单选文件)

    在本文中,我们将深入探讨如何使用JSP和jQuery实现一个简单的单选文件上传功能,并结合进度条显示上传进度。这是一个前端部分的实现,而后端部分需要根据实际项目需求自行完成。 首先,我们要明白JSP(JavaServer ...

    【ASP.NET编程知识】asp.net单文件带进度条上传的解决方案.docx

    本文主要讲述了ASP.NET单文件带进度条上传的解决方案,通过使用jquery框架和ASP.NET缓存机制,实现了文件上传和进度条显示的功能。 知识点1:使用jquery框架实现文件上传 在本文中,我们使用jquery框架来实现文件...

    jquery上传控件第三方控件,批量上传进度条显示jquery上传

    本文将深入探讨“jQuery上传控件”这一主题,特别关注第三方控件和批量上传功能,同时结合进度条显示技术,为开发者提供更高效、用户友好的文件上传体验。 首先,jQuery上传控件是网页应用中常见的组件,它允许用户...

    多款进度条 显示百分比

    在这个主题中,"多款进度条 显示百分比" 提供了多种使用jQuery实现的进度条插件,这些插件不仅展示进度,还能实时显示任务的完成百分比,为用户提供更直观的反馈。 首先,我们来讨论一下进度条的基本原理。进度条...

    C# 进度条显示 并且实时 显示百分比

    在C#编程中,创建一个实时显示进度的进度条是常见的需求,特别是在执行长时间操作时,如文件上传、下载或大型数据处理等。本程序通过使用线程技术解决了窗体主线程因执行耗时任务而无法实时更新界面的问题。下面我们...

    NeatUpload大文件上传(进度条显示)..

    在IT领域,大文件上传和进度条显示是用户体验的重要组成部分,尤其是在Web应用中。NeatUpload是一个专门针对ASP.NET平台设计的组件,旨在解决大文件上传时遇到的问题,如长时间等待、无法中断或监控上传进度等。这个...

    用js控制的上传进度条的显示

    在Web开发中,为了提升用户体验,经常需要在用户上传文件时展示一个进度条来显示上传的进度。通过使用JavaScript,我们可以轻松地实现实时更新进度条的效果。本文将详细介绍如何使用JavaScript来控制上传进度条的...

    文件上传(进度条显示)源码20130410

    "文件上传(进度条显示)源码20130410"这个资源提供了一个实现文件上传并带有进度条显示的功能,这对于提高用户体验至关重要。用户在上传大文件时,能够看到进度有助于他们了解操作的状态,避免了对系统是否响应的疑惑...

    jquery prototyoe文件上传(页面同时显示进度条,文件大小,上传信息)

    本篇文章将详细讲解如何利用jQuery和Prototype实现文件上传,并在页面上实时显示进度条、文件大小以及上传信息。 首先,jQuery的`$.ajax()`方法或`$.upload()`插件可以用来处理文件上传。`$.ajax()`支持`xhr.upload...

    Ajax + servlet 实现上传进度条显示

    利用Ajax和Servlet实现文件上传,用来commons-fileupload和commons-io两个包。这两个包也在里边。东西做的很简单,但重点是能对这个方法有所了解就行了,有人想做的更炫的可以自行修改。希望能对大家有所帮助。如果...

Global site tag (gtag.js) - Google Analytics