package com.guige.base.fileutils;

import com.alibaba.fastjson.JSONArray;
import com.aliyun.oss.ServiceException;
import com.guige.base.dto.FileBaseDto;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils; import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* TODO
*
* @author songaw
* @date 2018/4/9 17:07
*/
public abstract class FileUtil {
public static final String FILE_LOCAL="0";
public static final String FILE_OSS="1";
public static final String FILE_FTP="2";
private String storageType;
private Map<String,String> linkConf =new HashMap<>(); /**
* 根据一个配置得到对应的FileUtil
* @param storageType FileUtil类型 0本地 1 OSS 2FTP
* @return
* @throws Exception
*/
public static FileUtil sysConfigOfFileUtil(Map<String, String> linkConf, String storageType) throws Exception {
FileUtil fileUtil = null;
List<FileUtil> resultFileUtils = new ArrayList<>();
if (linkConf==null||linkConf.isEmpty()) {
return fileUtil;
} if (linkConf==null||linkConf.isEmpty()) {
return fileUtil;
}
List<Map<String, String>> linkConfList = new ArrayList<>();
linkConfList.add(linkConf);
resultFileUtils = sysConfigOfFileUtil(linkConfList, storageType);
if(CollectionUtils.isNotEmpty(resultFileUtils)){
fileUtil= resultFileUtils.get(0);
}
return fileUtil;
}
/**
* 根据一组链接配置 得到一组FileUtil
* @param confs 一组配置
* @param storageType FileUtil类型0本地 1 OSS 2FTP
* @return
* @throws Exception
*/
public static List<FileUtil> sysConfigOfFileUtil(List<Map<String, String>> confs, String storageType) throws Exception {
List<FileUtil> fileUtils = new ArrayList<>();
boolean isLinkSuccess = false;
try {
if (confs == null || confs.size() == 0) {
return fileUtils;
}
for (int i = 0; i < confs.size(); i++) {
Map<String, String> map = confs.get(i);
FileUtil fileUtil = null;
try {
switch (storageType) {
case "0":
fileUtil = new LocalFileUtil(map.get("ROOT_PATH"));
break;
case "1":
fileUtil = new OssFileUtil(map.get("END_POINT"), map.get("ACCESS_KEY_ID"), map.get("ACCESS_KEY_SECRET"), map.get("BUCKET_NAME"), map.get("PROXY_HOST"), map.get("PROXY_PORT"));
break;
case "2":
fileUtil = new FtpFileUtil(map.get("HOST"), Integer.parseInt(map.get("PORT")), map.get("USERNAME"), map.get("PASSWORD"));
break;
}
isLinkSuccess = true;
if (fileUtil != null) {
fileUtils.add(fileUtil);
}
} catch (Exception e) {
continue;
}
}
if (!isLinkSuccess) {
throw new RuntimeException("文件管理器创建失败");
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("文件管理器链接失败");
}
return fileUtils;
}
//上传文件 /**
* 保存文件
*
* @param path
* @param filename
* @param input
* @return
*/
public abstract boolean saveFile(String path, String filename, InputStream input, boolean replace_existing) throws IOException; /**
* 保存文件
*
* @param path
* @param filename
* @param fileDate
* @return
* @throws IOException
*/
public abstract boolean saveFile(String path, String filename, byte[] fileDate, boolean replace_existing) throws IOException; /**
* 保存文件base 64
*
* @param path
* @param filename
* @param base64Data
* @return
* @throws IOException
*/
public abstract boolean saveFile(String path, String filename, String base64Data, boolean replace_existing) throws IOException; /**
* 保存文件
*
* @param path 路径
* @param filename 文件名称
* @param file 文件
* @return
* @throws IOException
*/
public abstract boolean saveFile(String path, String filename, File file, boolean replace_existing) throws IOException; /**
* 保存文件 直接保存文件 文件名是File的name
*
* @param path 路径
* @param file 文件
* @return
* @throws IOException
*/
public abstract boolean saveFile(String path, File file, boolean replace_existing) throws IOException; /**
* 上传多个文件
*
* @param path
* @param files
* @return
* @throws IOException
*/
public abstract boolean saveFile(String path, List<File> files, boolean replace_existing) throws IOException; /**
* 上传已经存在的文件 到FTP或者 OSS
*
* @param path
* @param urls
* @return
* @throws IOException
*/
public abstract boolean saveLocalFile(String path, List<String> urls, boolean replace_existing) throws IOException; /**
* 读取文件
*
* @param path
* @param filename
* @return
*/
public abstract InputStream readInputStream(String path, String filename) throws IOException; /**
* 查询一个目录下的所有文件
*
* @param pathStr
* @return
*/
public abstract List<FileBaseDto> readFileList(String pathStr, boolean isReadDir) throws IOException; /**
* 查询文件
*
* @param path
* @param filename
* @return
*/
public abstract FileBaseDto readFileInfo(String path, String filename) throws IOException; /**
* 删除文件
*
* @param path 文件所在路径
* @return
*/
public abstract boolean delete(String path) throws IOException; /**
* 删除多个文件
*
* @param paths
* @return
*/
public abstract boolean delete(List<String> paths) throws IOException; /**
* 判断文件是否存在
*
* @param path
* @return
*/
public abstract boolean exists(String path) throws IOException; /**
* 移动文件
*
* @param path 原路径 可以是文件夹也可以是文件
* @param newPath 目标路径 跟原路径格式保持一致
* @param replace_existing 是否替換 (如果为true并且目标文件夹存在则会删除目标文件夹 然后进行移动)
* @return
*/
public abstract boolean moveTo(String path, String newPath, boolean replace_existing) throws IOException; /**
* 复制文件
*
* @param path 原路径 可以是文件夹也可以是文件
* @param newPath 目标路径 跟原路径格式保持一致
* @param replace_existing 是否替換 (如果为true并且目标文件夹存在则会删除目标文件夹 然后进行复制)
* @return
*/
public abstract boolean copy(String path, String newPath, boolean replace_existing) throws IOException; public String getContentType(String fileName) {
if (fileName.contains(".")) {
String fileExtension = fileName.substring(fileName.lastIndexOf(".")); switch (fileExtension) {
case "asf":
return "video/x-ms-asf"; case "avi":
return "video/avi"; case "doc":
return "application/msword"; case "docx":
return "application/msword"; case "zip":
return "application/zip"; case "xls":
return "application/vnd.ms-excel"; case "xlsx":
return "application/vnd.ms-excel"; case "gif":
return "image/gif"; case "jpg":
return "image/jpeg"; case "png":
return "image/jpeg"; case "jpeg":
return "image/jpeg"; case "wav":
return "audio/wav"; case "mp3":
return "audio/mpeg3"; case "mpg":
return "video/mpeg "; case "mepg":
return "video/mpeg"; case "rtf":
return "application/rtf"; case "html":
return "text/html"; case "mht":
return "message/rfc822"; case "mhtl":
return "message/rfc822"; case "txt":
return "text/plain"; default:
// throw new RuntimeException("fileutils type:" + ext + "can't be downloaded.");
return "multipart/form-data";
}
}
return "dir";
} public byte[] inputStream2ByteArray(File file) throws IOException { InputStream in = new FileInputStream(file);
byte[] data = toByteArray(in);
in.close(); return data;
} public byte[] toByteArray(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int n = 0;
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
return out.toByteArray();
}
public String getStorageType() {
return storageType;
} public void setStorageType(String storageType) {
this.storageType = storageType;
} public Map<String, String> getLinkConf() {
return linkConf;
} public void setLinkConf(Map<String, String> linkConf) {
this.linkConf = linkConf;
}
}
package com.guige.base.dto;

/**
* 文件管理帮助类
*
* @author songaw
* @date 2018/4/13 10:55
*/ public class FileBaseDto {
/**
* 文件的路径
*/
public String filePath;
/**
* 文件名
*/
public String originName;
/**
* 文件大小
*/
private Long fileSize;
/**
* 类型
*/
public String contentType; /**
* 存储类型,0 LOCAL, 1 OSS 2.FTP
*/
private Integer storageType; public String getFilePath() {
return filePath;
} public void setFilePath(String filePath) {
this.filePath = filePath;
} public String getOriginName() {
return originName;
} public void setOriginName(String originName) {
this.originName = originName;
} public Long getFileSize() {
return fileSize;
} public void setFileSize(Long fileSize) {
this.fileSize = fileSize;
} public String getContentType() {
return contentType;
} public void setContentType(String contentType) {
this.contentType = contentType;
} public Integer getStorageType() {
return storageType;
} public void setStorageType(Integer storageType) {
this.storageType = storageType;
}
}

文件存储 FileUtil FileBaseDto的更多相关文章

  1. android 开发-文件存储之读写sdcard

    android提供对可移除的外部存储进行文件存储.在对外部sdcard进行调用的时候首先要调用Environment.getExternalStorageState()检查sdcard的可用状态.通过 ...

  2. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  3. 深入理解Sqlserver文件存储之页和应用 (转)

    我们每天都在使用数据库,我们部门使用最多的关系数据库有Sqlserver,Oracle,有没有想过这些数据库是怎么存放到操作系统的文件中的?有时候为了能够设计出最优的表结构,写出高性能的Sqlserv ...

  4. app端上传文件至服务器后台,web端上传文件存储到服务器

    1.android前端发送服务器请求 在spring-mvc.xml 将过滤屏蔽(如果不屏蔽 ,文件流为空) <!-- <bean id="multipartResolver&q ...

  5. MongoDb gridfs-ngnix文件存储方案

          在各类系统应用服务端开发中,我们经常会遇到文件存储的问题. 常见的磁盘文件系统,DBMS传统文件流存储.今天我们看一下基于NoSQL数据库MongoDb的存储方案.笔者环境 以CentOS ...

  6. Hadoop中pid文件存储

    我的hadoop集群部署在自己电脑虚拟机上,有时候我是挂起虚拟机,第二天再打开发现有些线程就挂了,比如namenode,好奇怪,当时看了一些帖子说是和pid存储有关,找到log看到找不到pid.因为基 ...

  7. Android文件存储

    文件存储是Android中最基本的一种数据存储方式,它不读存储的内容进行任何的格式化处理,所有数据原封不动的保存在文件之中.如果想用文件存储的方式保存一些较为复杂的数据,就需要定义一套自己的格式规范, ...

  8. Kafka深入理解-1:Kafka高效的文件存储设计

    文章摘自:美团点评技术团队  Kafka文件存储机制那些事 Kafka是什么 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日 ...

  9. .Net平台下,分布式文件存储的实现

    遇到的问题 对于Web程序,使用一台服务器的时候,客户端上传的文件一般也都是存储在这台服务器上.但在集群环境中就行不通了,如果每个服务器都存储自己接受到的文件,就乱套了,数据库中明明有这个附件的记录, ...

随机推荐

  1. vue2自定义事件之$emit

    父组件: API上的解释不多: https://cn.vuejs.org/v2/api/#vm-emit vm.$emit( event, […args] ) 参数: {string} event [ ...

  2. 一次@value取值失败的原因

    网上down了一份源码.启动后报错,通过报错信息定位到这个地方: 之前对这个@Value的实现方式我也没了解过,所以乘机对springboot关于这一块的源码研究了一下.可以参考当时我的一篇分析记录& ...

  3. js 上传图片进行回显

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. C语言中的union使用方法

    union共用声明和共用一变量定义: "联合"是一种特殊的类,也是一种构造类型的数据结构.在一个"联合"内能够定义多种不同的数据类型. 一个被说明为该" ...

  5. win8.1休眠状态下不能进入系统

    win8.1下进入睡眠状态出现的问题: 1.合上盖子或者是点击睡眠状态后唤醒进入锁屏界面.可是仅仅能鼠标移动,键盘全然输入不了,出现假死现象,仅仅能强制重新启动. 2.合上盖子再打开无法唤醒屏幕,必须 ...

  6. 工作流学习——Activiti流程变量五步曲

    一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量. 二.正文 流程变量与我们寻常理解的变量是一样的,仅仅只是是用在了我们act ...

  7. Android开发之Is Library篇

    一.生活场景描述 由于公司有一个项目开发的时间比较长,项目里堆砌的代码也比较多,并且有些功能在给不同客户发布的时候有些功能还不需要,这样功能模块分离就很有必要了. 所以,Library就被推到了前台, ...

  8. Java 8 List

    排序 依据自定义对象的某个属性进行排序. List<Student> students = Arrays.asList(student1, student2, student3); stu ...

  9. 创建支持多种屏幕尺寸的apk

    文章转至:http://hell0android.iteye.com/blog/1899605 创建对两种以上屏幕尺寸的多apk支持(Creating Multiple APKs with 2+ Di ...

  10. EXTJS4自学手册——报表概述

    Ext画报表所涉及到的组件关系如下: Store:数据容器 Legend:图像说明 Axis:横.纵坐标 Series:报表图像