文件上传之重制版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangxin09/article/details/79054233

许久之前,小弟写过一个文件上传的,那时还是基于 JSP 的,详见《http://blog.csdn.net/zhangxin09/article/details/51543300》。不过最近看的代码不爽,于是又重新捣腾一下,就变成今天这样子了。

源码:https://gitee.com/sp42/ajaxjs/tree/master/src/main/com/ajaxjs/web/upload

用法很简单:

UploadRequest r = new UploadRequest(request);
if(r.upload().isOk){
    // 上传成功
}

首先一定要传入构建参数 request,然后 r.upload() 是执行上传的方法,返回的是 UploadResult 对象,用于显示上传结果,其字段如下

package com.ajaxjs.web.upload;

/**
 * 上传结果
 * 
 * @author Sp42 [email protected]
 *
 */
public class UploadResult {
    /**
     * 上传成功之文件名
     */
    public String fileName;
    /**
     * 上传成功之文件完整路径
     */
    public String fullPath;
    /**
     * 是否上传成功
     */
    public boolean isOk;
    /**
     * 若不成功,是什么异常信息
     */
    public String errMsg;
}

前面例子是默认的配置情况。负责配置的接口是 UploadConfig 和默认实现类 UploadConfigImpl,开发者可以通过了解这两个类,然后自定义自己的上传配置。

package com.ajaxjs.web.upload;

/**
 * 配置接口
 * 
 * @author Sp42 [email protected]
 *
 */
public interface UploadConfig {
    /**
     * 单次文件上传最大字节
     * 
     * @return 单次文件上传最大字节
     */
    public int getMaxTotalFileSize();

    /**
     * 单个文件上传最大字节
     * 
     * @return 单个文件上传最大字节
     */
    public int getMaxSingleFileSize();

    /**
     * 允许上传的文件类型,如果为空数组则不限制上传类型。格式如 {".jpg", ".png", ...}
     * 
     * @return
     */
    public String[] getAllowExtFilenames();

    /**
     * 相同文件名是否覆盖?
     * 
     * @return true=允许覆盖
     */
    public boolean isFileOverwrite();

    /**
     * 保存文件的目录
     * 
     * @return
     */
    public String getSaveFolder();

    /**
     * 是否按照表单里的名字,还是改名?在这里决定
     * 
     * @param meta
     * @return
     */
    public String getFileName(MetaData meta);
}

实现类:

package com.ajaxjs.web.upload;

/**
 * 默认配置实现类
 * 
 * @author Sp42 [email protected]
 *
 */
public class UploadConfigImpl implements UploadConfig {
    @Override
    public int getMaxTotalFileSize() {
        return 1024 * 5000;
    }

    @Override
    public int getMaxSingleFileSize() {
        return 1024 * 1000; // 默认 1 MB
    }

    static String[] ext = new String[] { ".jpg", ".png", ".gif" };

    @Override
    public String[] getAllowExtFilenames() {
        return ext;
    }

    @Override
    public boolean isFileOverwrite() {
        return true;
    }

    @Override
    public String getSaveFolder() {
        return "c:\\temp\\";
    }

    @Override
    public String getFileName(MetaData meta) {
        //      return "" + System.currentTimeMillis();
        return meta.filename;
    }
}

如果你使用 AJAXJS Web 框架,那么可以通过读取 JSON 配置访问其中的上传配置,使用 UploadConfigByConfigFile 类即可。

@POST
@Path("imgUpload")
public String imgUpload(HttpServletRequest request) throws IOException {
    UploadRequest u = new UploadRequest(request);
    u.setConfig(new UploadConfigByConfigFile());
    UploadResult result = u.upload();
    if (result.isOk)
        return String.format(json_ok, result.fileName + "上传成功!");
    else
        return String.format(json_not_ok, result.fileName + "上传失败!");
}

开始我打算使用 IOC 注射配置,但发现1、UploadRequest 需要构造器参数,2、UploadRequest 不能单例。于是就放弃 IOC 的想法了。

暂时这个文件上传只能接受单个文件上传,mulitpart 尚不支持。

关于大文件上传的几篇文章:
- http://blog.csdn.net/u014150463/article/details/74044467
- https://www.cnblogs.com/darkprince/p/5114936.html
- https://github.com/grayprince/UploadBigFile
- http://www.ncmem.com/v2/index.aspx

科普文:
- http://blog.csdn.net/ybygjy/article/details/5869158
- https://wenku.baidu.com/view/1b166c3f14791711cc791728.html

猜你喜欢

转载自blog.csdn.net/zhangxin09/article/details/79054233