上传进度条显示

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

你可能感兴趣的:(上传进度条)