package com.norteksoft.product.api.impl;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import com.ibm.icu.text.SimpleDateFormat;
import com.norteksoft.product.api.FileService;
import com.norteksoft.product.enumeration.UploadFileType;
import com.norteksoft.product.mongo.MongoFile;
import com.norteksoft.product.mongo.MongoService;
import com.norteksoft.product.util.PropUtils;
import com.norteksoft.product.util.ThreeDes;
public class FileServiceImpl implements FileService {
private MongoService mongoService;
public void setMongoService(MongoService mongoService) {
this.mongoService = mongoService;
}
public String saveFile(File file) {
String uploadFileType=PropUtils.getProp("application.properties","upload.file.type");
if(StringUtils.isEmpty(uploadFileType)){
uploadFileType=PropUtils.getProp("applicationContent.properties","upload.file.type");
}
String filePath="";
try {
switch (UploadFileType.valueOf(uploadFileType)) {
case SERVERS_SECRET:
filePath=uploadSecret(file);
break;
case SERVERS_NORMAL:
filePath=uploadNormal(file);
break;
case MONGO_SERVERS:
MongoFile mongoFile = mongoService.saveFile(file, "");
filePath=mongoFile.getFileId();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
return filePath;
}
private String uploadSecret(File file)throws Exception{
String path=PropUtils.getProp("application.properties","upload.file.path");
if(StringUtils.isEmpty(path)){
path=PropUtils.getProp("applicationContent.properties","upload.file.path");
}
return ThreeDes.encryptFile(path,file.getPath());
}
private String uploadNormal(File file)throws Exception{
String path=PropUtils.getProp("application.properties","upload.file.path");
if(StringUtils.isEmpty(path)){
path=PropUtils.getProp("applicationContent.properties","upload.file.path");
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
path = cretaFolder(path+"/"+format.format(new Date())+"/");
path += UUID.randomUUID().toString();
return uploadFile(file, path);
}
public String saveFile(byte[] file) {
String uploadFileType=PropUtils.getProp("application.properties","upload.file.type");
if(StringUtils.isEmpty(uploadFileType)){
uploadFileType=PropUtils.getProp("applicationContent.properties","upload.file.type");
}
String filePath="";
try {
switch (UploadFileType.valueOf(uploadFileType)) {
case SERVERS_SECRET:
filePath=uploadSecret(file);
break;
case SERVERS_NORMAL:
filePath=uploadNormal(file);
break;
case MONGO_SERVERS:
MongoFile mongoFile = mongoService.saveFile(file, "");
filePath=mongoFile.getFileId();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
return filePath;
}
private String uploadSecret(byte[] file)throws Exception{
String path=PropUtils.getProp("application.properties","upload.file.path");
if(StringUtils.isEmpty(path)){
path=PropUtils.getProp("applicationContent.properties","upload.file.path");
}
return ThreeDes.encryptFile(path,file);
}
private String uploadNormal(byte[] file)throws Exception{
String path=PropUtils.getProp("application.properties","upload.file.path");
if(StringUtils.isEmpty(path)){
path=PropUtils.getProp("applicationContent.properties","upload.file.path");
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
path = cretaFolder(path+"/"+format.format(new Date())+"/");
path += UUID.randomUUID().toString();
BufferedInputStream bis = null;
FileOutputStream out = null;
try {
bis = new BufferedInputStream(new ByteArrayInputStream(file));
byte[] buffer = new byte[1024*1024];
int size=0;
out = new FileOutputStream(path);
while ((size=bis.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0,size);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
out.close();
bis.close();
}
return path;
}
/**
* 创建文件夹
* @param path
* @return
*/
private String cretaFolder(String path){
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
return path;
}
/**
* 上传文件
*/
private String uploadFile(File path,String serverPath)throws Exception{
FileUtils.copyFile(path, new File(serverPath));
return serverPath;
}
public byte[] getFile(String filePath) {
String uploadFileType=PropUtils.getProp("application.properties","upload.file.type");
if(StringUtils.isEmpty(uploadFileType)){
uploadFileType=PropUtils.getProp("applicationContent.properties","upload.file.type");
}
byte[] file=null;
try {
switch (UploadFileType.valueOf(uploadFileType)) {
case SERVERS_SECRET:
file =ThreeDes.decryptFile(filePath);
break;
case SERVERS_NORMAL:
file = FileUtils.readFileToByteArray(new File(filePath));
break;
case MONGO_SERVERS:
file = mongoService.getFile(filePath);
break;
}
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
public void writeTo(String filePath,OutputStream out) {
String uploadFileType=PropUtils.getProp("application.properties","upload.file.type");
if(StringUtils.isEmpty(uploadFileType)){
uploadFileType=PropUtils.getProp("applicationContent.properties","upload.file.type");
}
try {
switch (UploadFileType.valueOf(uploadFileType)) {
case SERVERS_SECRET:
ThreeDes.decryptFile(filePath,out);
break;
case SERVERS_NORMAL:
byte[] file=FileUtils.readFileToByteArray(new File(filePath));
out.write(file);
out.close();
break;
case MONGO_SERVERS:
mongoService.writeTo(filePath, out);
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void deleteFile(String filePath){
String uploadFileType=PropUtils.getProp("application.properties","upload.file.type");
if(StringUtils.isEmpty(uploadFileType)){
uploadFileType=PropUtils.getProp("applicationContent.properties","upload.file.type");
}
try {
switch (UploadFileType.valueOf(uploadFileType)) {
case SERVERS_SECRET:
FileUtils.deleteDirectory(new File(filePath));
break;
case SERVERS_NORMAL:
FileUtils.deleteQuietly(new File(filePath));
break;
case MONGO_SERVERS:
mongoService.deleteFile(filePath);
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}