LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 906|回复: 5

文件上传的源代码

[复制链接]
发表于 2005-2-18 17:51:23 | 显示全部楼层 |阅读模式
[PHP]
package web.upload;

import javax.servlet.http.HttpServletRequest;

/**
* 为外界使用web方式上传,提供的接口上传调用
* @author fangshun
*/
public interface FileUpload {
        /**
         * 基于web的文件上传,其他web应用程序可以调用这个对象的fileUpload接口,
         * 生成这个FileUpload实例需要你去调用提供的FileUploadFactroy工厂类中
         * 的工厂方法。
         *
         * @param request 需要得到从上传页面传来的request对象。
         *
         * @param pathName 服务器存放上传文件的绝对路径,
         * 这可能来自你自己的指定,或者来自你要解析的某个已经配置好的配置文件
         * 例如WEB-INF下的某个目录的xml配置文件
         *
         * @param sizeMax 需要上传的文件总体的容量,这里使用long类型,以满足
         * 能支持大容量的文件上传,请注意:上传参数sizeMax的最小单位为'K'
         *
         * 该接口会可能会抛出三种异常:
         * @throws NullPointerException 如果传入的参数request,pathName为null
         * @throws FileSizeException 如果传入的sizeMax使用了非法的尺度,例如sizeMax < 0
         * @throws SizeLimitExceededException 如果上传的文件集合总体的容量尺度大于了规定的最大尺度
         *
         * 以上异常需要你去截获,并且做相应的处理,以便给用户返回错误的真正状况。
         */
    public void upload(HttpServletRequest request, String pathName,
        long sizeMax) throws Exception;
}

[/PHP]
 楼主| 发表于 2005-2-18 18:16:45 | 显示全部楼层
[PHP]
package web.upload;
/**
* 使用工厂类方法,创建上传实例实现代理过程
* @author fangshun
*/
public class FileUploadFactroy  {

        //fileUpload对象静态处理
    private static FileUpload fileUpload;

    /**
     * 工厂方法,创建FileUpload类实例,Singleton单实例Proxy
     * @return FileUpload 具体FileUpload实例
     */
    public static FileUpload createUpload() {
        if (fileUpload == null) {
            fileUpload = new FileUploadProxy();
        }

        return fileUpload;
    }


}
[/PHP]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-18 18:31:14 | 显示全部楼层
[PHP]
package web.upload;

import java.io.File;
import java.util.Iterator;
import java.util.List;


import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;

import javax.servlet.http.HttpServletRequest;


/**
* 文件上传进行代理服务,阻止不符合上传规范的文件进入。
* 使用单实例创建,外部调用只有通过工厂方法才可以创建唯一的代理实例。
* @author fangshun
* @see FileUploadFactroy
*/
public class FileUploadProxy implements FileUpload {
        /**
         * 外部调用只有通过工厂方法才可以创建唯一的代理实例。
         */
        protected FileUploadProxy()  {}
       
        /**
         * 上传方法<tt>upload</tt>的代理验证,阻止不符合规范的上传方式,
         * 实现接口的方法。
         * @param request 需要得到从上传页面传来的request对象。
         *
         * @param pathName 服务器存放上传文件的绝对路径,
         * 这可能来自你自己的指定,或者来自你要解析的某个已经配置好的配置文件
         * 例如WEB-INF下的某个目录的xml配置文件
         *
         * @param sizeMax 需要上传的文件总体的容量,这里使用long类型,以满足
         * 能支持大容量的文件上传,请注意:上传参数sizeMax的最小单位为'K'
         *
         * @throws Exception
         * @see FileUpload
         */
    public void upload(HttpServletRequest request, String pathName, long sizeMax)
        throws Exception {
        // TODO Auto-generated method stub
        if ((request == null) || (pathName == null)) {
            throw new NullPointerException("parameter");
        }

        if (sizeMax < 0) {
            throw new FileSizeException("File Require Size ");
        } else {
            //从request中获取上下文内容尺度
            int requestSize = request.getContentLength();

            //为传来的最大容量乘以1024,获得符合以'K'为单位的尺度
            long sizeMax_K = sizeMax << 10;

            //String pathNameCN = new String(pathName.getBytes("utf-8"), "gb2312");
            //如果传来的尺度大于上传的最大限度
            if (requestSize > sizeMax_K) {
                throw new SizeLimitExceededException(
                    "the request was rejected because " +
                    "it's size exceeds allowed range");
            }
            String contentType = request.getContentType();
            //如果传来的条件符合代理类的要求,执行上传操作!!!
            FileUploadimpl upload = FileUploadimpl.getInstance();

            upload.processUpload(request, pathName, sizeMax_K);
        }
    }
   
    /**
     * 上传实现细节
     *        内隐类实现
     * @author fangshun
     */
    private static class FileUploadimpl {
            private static FileUploadimpl upload;
           
            /**
             * 外界对象不能进行实例化,包私有创建对象。
             */
            private FileUploadimpl () { }
           
            private static FileUploadimpl getInstance() {
                    if(upload == null) {
                            upload = new FileUploadimpl ();
                    }
                    return upload;
            }

        /**
         * 上传实现
             * @param request 需要得到从上传页面传来的request对象。
             *
             * @param pathName 服务器存放上传文件的绝对路径,
             * 这可能来自你自己的指定,或者来自你要解析的某个已经配置好的配置文件
             * 例如WEB-INF下的某个目录的xml配置文件
             *
             * @param sizeMax 需要上传的文件总体的容量,这里使用long类型,以满足
             * 能支持大容量的文件上传,参数sizeMax的最小单位为'K'
             * @throws Exception
         */
        private void processUpload(HttpServletRequest request, String filePath, long sizeMax)
            throws Exception {
                DiskFileUpload fu = new DiskFileUpload();
            String encoding = request.getCharacterEncoding();
            fu.setHeaderEncoding(encoding);
            // If file size exceeds, a FileUploadException will be thrown
            fu.setSizeMax(sizeMax);

            List fileItems = fu.parseRequest(request);
            Iterator itr = fileItems.iterator();

            while (itr.hasNext()) {
                FileItem fi = (FileItem) itr.next();
                String fileName = fi.getName();
                if(fileName == null || fileName.equals("")) {
                        continue;
                }
                System.out.println("no convert" + fileName);
                //fileName = new String(fileName.getBytes(), "utf-8");
               // fileName = new String(fileName.getBytes(), "gb2312");
                System.out.println("fileName" + fileName);
                //Check if not form field so as to only handle the file inputs
                //else condition handles the submit button input
                if (!fi.isFormField()) {
                    File file = new File(fileName);
                    File fNew = new File(filePath, file.getName());

                            fi.write(fNew);

                } else {
                    System.out.println("Field =" + fi.getFieldName());
                }
            }
        }

    }

}

[/PHP]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-18 18:33:47 | 显示全部楼层
[PHP]
package web.upload;

/**
* 文件上传尺度不符合规定时抛出的用户逻辑异常
* @author fangshun
*/
public class FileSizeException extends Exception {
    /**
     * Constructs a new <tt>FileUploadException</tt> without message.
     */
    public FileSizeException()
    {
    }

    /**
     * Constructs a new <tt>FileUploadException</tt> with specified detail
     * message.
     *
     * @param msg the error message.
     */
    public FileSizeException(String msg)
    {
        super(msg);
    }

}

[/PHP]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-18 18:37:01 | 显示全部楼层
请使用工厂方法创建上传实例,提供接口。
String encoding = request.getCharacterEncoding();
fu.setHeaderEncoding(encoding);
encoding 例如:“gbk” 可以自定义设置到request中利用setCharacterEncoding(String encoding)l
回复 支持 反对

使用道具 举报

发表于 2005-2-25 12:33:58 | 显示全部楼层
赞一把
linuxsir鼓励原创 :cool:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表