• 文件上传工具类


    public class UploadUtils {
    /**
    * 表单字段常量
    */
    public static final String FORM_FIELDS = "form_fields";
    /**
    * 文件域常量
    */
    public static final String FILE_FIELDS = "file_fields";

    // 最大文件大小
    private long maxSize = 1000000;
    // 定义允许上传的文件扩展名
    private Map<String, String> extMap = new HashMap<String, String>();
    // 文件保存目录相对路径
    private String basePath = "upload";
    // 文件的目录名
    private String dirName = "images";
    // 上传临时路径
    private static final String TEMP_PATH = "/temp";
    private String tempPath = basePath + TEMP_PATH;
    // 若不指定则文件名默认为 yyyyMMddHHmmss_xyz
    private String fileName;

    // 文件保存目录路径
    private String savePath;
    // 文件保存目录url
    private String saveUrl;
    // 文件最终的url包括文件名
    private String fileUrl;

    public UploadUtils() {
    // 其中images,flashs,medias,files,对应文件夹名称,对应dirName
    // key文件夹名称
    // value该文件夹内可以上传文件的后缀名
    extMap.put("images", "gif,jpg,jpeg,png,bmp");
    extMap.put("flashs", "swf,flv");
    extMap.put("medias", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
    extMap.put("files", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
    }

    /**
    * 文件上传
    *
    * @param request
    * @return infos info[0] 验证文件域返回错误信息 info[1] 上传文件错误信息 info[2] savePath info[3] saveUrl info[4] fileUrl
    */
    @SuppressWarnings("unchecked")
    public String[] uploadFile(HttpServletRequest request) {
    String[] infos = new String[5];
    // 验证
    infos[0] = this.validateFields(request);
    // 初始化表单元素
    Map<String, Object> fieldsMap = new HashMap<String, Object>();
    if (infos[0].equals("true")) {
    fieldsMap = this.initFields(request);
    }
    // 上传
    List<FileItem> fiList = (List<FileItem>) fieldsMap.get(UploadUtils.FILE_FIELDS);
    if (fiList != null) {
    for (FileItem item : fiList) {
    infos[1] = this.saveFile(item);
    }
    infos[2] = savePath;
    infos[3] = saveUrl;
    infos[4] = fileUrl;
    }
    return infos;
    }

    /**
    * 上传验证,并初始化文件目录
    *
    * @param request
    */
    private String validateFields(HttpServletRequest request) {
    String errorInfo = "true";
    // boolean errorFlag = true;
    // 获取内容类型
    String contentType = request.getContentType();
    int contentLength = request.getContentLength();
    // 文件保存目录路径
    savePath = request.getSession().getServletContext().getRealPath("/") + basePath + "/";
    // 文件保存目录URL
    saveUrl = request.getContextPath() + "/" + basePath + "/";
    File uploadDir = new File(savePath);
    if (contentType == null || !contentType.startsWith("multipart")) {
    // TODO
    System.out.println("请求不包含multipart/form-data");
    errorInfo = "请求不包含multipart/form-data";
    } else if (maxSize < contentLength) {
    // TODO
    System.out.println("上传文件大小超出文件最大大小");
    errorInfo = "上传文件大小超出文件最大大小[" + maxSize + "]";
    } else if (!ServletFileUpload.isMultipartContent(request)) {
    // TODO
    errorInfo = "请选择文件";
    } else if (!uploadDir.isDirectory()) {// 检查目录
    // TODO
    errorInfo = "上传目录[" + savePath + "]不存在";
    } else if (!uploadDir.canWrite()) {
    // TODO
    errorInfo = "上传目录[" + savePath + "]没有写权限";
    } else if (!extMap.containsKey(dirName)) {
    // TODO
    errorInfo = "目录名不正确";
    } else {
    // .../basePath/dirName/
    // 创建文件夹
    savePath += dirName + "/";
    saveUrl += dirName + "/";
    File saveDirFile = new File(savePath);
    if (!saveDirFile.exists()) {
    saveDirFile.mkdirs();
    }
    // .../basePath/dirName/yyyyMMdd/
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    String ymd = sdf.format(new Date());
    savePath += ymd + "/";
    saveUrl += ymd + "/";
    File dirFile = new File(savePath);
    if (!dirFile.exists()) {
    dirFile.mkdirs();
    }

    // 获取上传临时路径
    tempPath = request.getSession().getServletContext().getRealPath("/") + tempPath + "/";
    File file = new File(tempPath);
    if (!file.exists()) {
    file.mkdirs();
    }
    }

    return errorInfo;
    }

    /**
    * 处理上传内容
    *
    * @param request
    * @param maxSize
    * @return
    */
    // @SuppressWarnings("unchecked")
    private Map<String, Object> initFields(HttpServletRequest request) {

    // 存储表单字段和非表单字段
    Map<String, Object> map = new HashMap<String, Object>();

    // 第一步:判断request
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    // 第二步:解析request
    if (isMultipart) {
    // Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();

    // 阀值,超过这个值才会写到临时目录,否则在内存中
    factory.setSizeThreshold(1024 * 1024 * 10);
    factory.setRepository(new File(tempPath));

    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);

    upload.setHeaderEncoding("UTF-8");

    // 最大上传限制
    upload.setSizeMax(maxSize);

    /* FileItem */
    List<FileItem> items = null;
    // Parse the request
    try {
    items = upload.parseRequest(request);
    } catch (FileUploadException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    // 3步:处理uploaded items
    if (items != null && items.size() > 0) {
    Iterator<FileItem> iter = items.iterator();
    // 文件域对象
    List<FileItem> list = new ArrayList<FileItem>();
    // 表单字段
    Map<String, String> fields = new HashMap<String, String>();
    while (iter.hasNext()) {
    FileItem item = iter.next();
    // 处理所有表单元素和文件域表单元素
    if (item.isFormField()) { // 表单元素
    String name = item.getFieldName();
    String value = item.getString();
    fields.put(name, value);
    } else { // 文件域表单元素
    list.add(item); } }


    map.put(FORM_FIELDS, fields);
    map.put(FILE_FIELDS, list); } }


    return map; }


    /**
    * 保存文件
    *
    * @param obj
    * 要上传的文件域
    * @param file
    * @return
    */
    private String saveFile(FileItem item) {
    String error = "true";
    String fileName = item.getName();
    String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

    if (item.getSize() > maxSize) { // 检查文件大小
    // TODO
    error = "上传文件大小超过限制"; }
    else if (!Arrays.<String> asList(extMap.get(dirName).split(",")).contains(fileExt)) {// 检查扩展名
    error = "上传文件扩展名是不允许的扩展名。 只允许" + extMap.get(dirName) + "格式。"; }
    else {
    String newFileName;
    if ("".equals(fileName.trim())) {
    SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
    newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; }
    else {
    newFileName = fileName + "." + fileExt; }

    // .../basePath/dirName/yyyyMMdd/yyyyMMddHHmmss_xxx.xxx
    fileUrl = saveUrl + newFileName;
    try {
    File uploadedFile = new File(savePath, newFileName); item.write(

    uploadedFile);

    /*
    * FileOutputStream fos = new FileOutputStream(uploadFile); // 文件全在内存中 if (item.isInMemory()) { fos.write(item.get()); } else { InputStream is = item.getInputStream(); byte[] buffer =
    * new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); } is.close(); } fos.close(); item.delete();
    */
    } catch (IOException e) { e.printStackTrace();

    System.out.println("上传失败了!!!"); }
    catch (Exception e) { e.printStackTrace(); } }



    return error; }


    /** **********************get/set方法********************************* */

    public String getSavePath() {
    return savePath; }


    public String getSaveUrl() {
    return saveUrl; }


    public long getMaxSize() {
    return maxSize; }


    public void setMaxSize(long maxSize) {
    this.maxSize = maxSize; }


    public Map<String, String> getExtMap() {
    return extMap; }


    public void setExtMap(Map<String, String> extMap) {
    this.extMap = extMap; }


    public String getBasePath() {
    return basePath; }


    public void setBasePath(String basePath) {
    this.basePath = basePath;
    tempPath = basePath + TEMP_PATH; }


    public String getDirName() {
    return dirName; }


    public void setDirName(String dirName) {
    this.dirName = dirName; }


    public String getTempPath() {
    return tempPath; }


    public void setTempPath(String tempPath) {
    this.tempPath = tempPath; }


    public String getFileUrl() {
    return fileUrl; }


    public String getFileName() {
    return fileName; }


    public void setFileName(String fileName) {
    this.fileName = fileName; }}


  • 相关阅读:
    Partition4:增加分区
    Partition5:Partiton Scheme是否指定Next Used?
    UniqueIdentifier 数据类型 和 GUID 生成函数
    SQL Server 并发控制 第三篇:隔离级别和行版本(2)
    SQL Server 常用内置函数
    In-Memory:在内存中创建临时表和表变量
    Partition2:对现有表分区
    Partition1:新建分区表
    Partition3:分区切换(Switch)
    Pivot 和 Unpivot
  • 原文地址:https://www.cnblogs.com/luyuefei/p/13386370.html
Copyright © 2020-2023  润新知