package com.qxueyou.scc.teach.res.service.impl;
|
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.Calendar;
|
import java.util.GregorianCalendar;
|
import java.util.Map;
|
|
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import com.qxueyou.scc.base.model.Result;
|
import com.qxueyou.scc.base.service.impl.CommonAppService;
|
import com.qxueyou.scc.base.util.CollectionUtils;
|
import com.qxueyou.scc.base.util.QFileUtils;
|
import com.qxueyou.scc.base.util.TraceUtils;
|
import com.qxueyou.scc.base.util.UUIDUtils;
|
import com.qxueyou.scc.config.SccConfig;
|
import com.qxueyou.scc.teach.res.model.ResFile;
|
import com.qxueyou.scc.teach.res.service.IFileService;
|
|
/**
|
* 所有文件上传的操作,单独到文件上传工程后,后续业务操作需要下载文件调用的方法
|
*
|
* @author xiadehu
|
*
|
*/
|
@Service
|
public class FileService extends CommonAppService implements IFileService {
|
|
private final Logger log = LogManager.getLogger(FileService.class);
|
|
/*
|
* 文件类型:目前支持四种
|
*/
|
public final static String FILE_TYPE_VIDEO = "video";
|
|
public final static String FILE_TYPE_DOC = "doc";
|
|
public final static String FILE_TYPE_AUDIO = "audio";
|
|
public final static String FILE_TYPE_DATA = "data";
|
|
public final static String FILE_TYPE_IMG = "img";
|
|
private static final Map<String, String> fileFormatMap = CollectionUtils.newStringMap("MPEG", FILE_TYPE_VIDEO,
|
"AVI", FILE_TYPE_VIDEO, "MOV", FILE_TYPE_VIDEO, "ASF", FILE_TYPE_VIDEO, "WMV", FILE_TYPE_VIDEO, "NAVI",
|
FILE_TYPE_VIDEO, "3GP", FILE_TYPE_VIDEO, "RAM", FILE_TYPE_VIDEO, "RA", FILE_TYPE_VIDEO, "MKV",
|
FILE_TYPE_VIDEO, "F4V", FILE_TYPE_VIDEO, "RMVB", FILE_TYPE_VIDEO, "MP4", FILE_TYPE_VIDEO,
|
|
"DOC", FILE_TYPE_DOC, "DOCX", FILE_TYPE_DOC, "PDF", FILE_TYPE_DOC, "PPT", FILE_TYPE_DOC, "PPTX",
|
FILE_TYPE_DOC, "XLS", FILE_TYPE_DOC, "XLSX", FILE_TYPE_DOC,
|
|
"MP3", FILE_TYPE_AUDIO, "WMA", FILE_TYPE_AUDIO, "WAV", FILE_TYPE_AUDIO,
|
|
"DATA", FILE_TYPE_DATA,
|
|
"JPG", FILE_TYPE_IMG,"JPEG", FILE_TYPE_IMG, "GIF", FILE_TYPE_IMG, "BMP", FILE_TYPE_IMG, "PNG", FILE_TYPE_IMG
|
|
);
|
|
@Autowired
|
private SccConfig config;
|
|
@Override
|
public Result doUpload(InputStream in, String name) {
|
try {
|
|
String destPath = getDestPath(name);
|
String fullPath = config.getResRootPath() + "/" + destPath;
|
|
File fileRoot = new File(fullPath.substring(0, fullPath.lastIndexOf("/")));
|
|
if (!fileRoot.exists()) {
|
fileRoot.mkdirs();
|
}
|
FileUtils.copyInputStreamToFile(in, new File(fullPath));
|
|
ResFile file = insertFileToDB(name, fullPath, destPath, getFileType(name));
|
|
return new Result(true, "success",
|
CollectionUtils.newStringMap("fileId", file.getFileId(), "path", destPath));
|
} catch (Exception e) {
|
log.error(e, e);
|
} finally {
|
IOUtils.closeQuietly(in);
|
}
|
return new Result(false, "save file error");
|
}
|
|
/**
|
* 插入文件信息到数据库
|
*
|
* @param name
|
* @param fullPath
|
* 全路径
|
* @param relativePath
|
* 相对路径
|
* @param type
|
* 文件类型,非文件格式
|
* @return
|
*/
|
public ResFile insertFileToDB(String name, String fullPath, String relativePath, String type) {
|
|
ResFile file = new ResFile();
|
|
TraceUtils.setCreateTrace(file);
|
file.setFileName(name);
|
file.setFileFormat(QFileUtils.getFileFormat(name));
|
file.setFileType(type);
|
// TODO
|
file.setMd5Hash(null);
|
file.setPath(relativePath);
|
file.setSize(FileUtils.sizeOf(new File(fullPath)));
|
// TODO
|
file.setTenantId(null);
|
file.setDeleteFlag(false);
|
|
save(file);
|
|
return file;
|
|
}
|
/**
|
* 插入文件信息到数据库
|
*
|
* @param name
|
* @param relativePath
|
* 相对路径
|
* @param type
|
* 文件类型,非文件格式
|
* @return
|
*/
|
public ResFile insertFileToDBTwo(String name, Long Size, String relativePath, String type) {
|
|
ResFile file = new ResFile();
|
|
TraceUtils.setCreateTrace(file);
|
file.setFileName(name);
|
file.setFileFormat(QFileUtils.getFileFormat(name));
|
file.setFileType(type);
|
// TODO
|
file.setMd5Hash(null);
|
file.setPath(relativePath);
|
file.setSize(Size);
|
// TODO
|
file.setTenantId(null);
|
file.setDeleteFlag(false);
|
|
save(file);
|
|
return file;
|
|
}
|
|
/**
|
* 获取文件类型
|
*
|
* @param name
|
* @return
|
*/
|
private String getFileType(String name) {
|
String fileType = fileFormatMap.get(QFileUtils.getFileFormat(name));
|
return StringUtils.isEmpty(fileType) ? FILE_TYPE_DATA : fileType;
|
}
|
|
/**
|
* 获取文件目标路径
|
*
|
* @param name
|
* @return
|
*/
|
private String getDestPath(String name) {
|
String fileType = getFileType(name);
|
|
StringBuffer path = new StringBuffer(128);
|
path.append(fileType);
|
|
Calendar now = new GregorianCalendar();
|
|
path.append('/');
|
path.append(now.get(Calendar.YEAR));
|
path.append(StringUtils.leftPad(String.valueOf(now.get(Calendar.MONTH)), 2, '0'));
|
path.append('/');
|
path.append(now.get(Calendar.DAY_OF_MONTH));
|
path.append('/');
|
path.append(UUIDUtils.UUID());
|
path.append('.');
|
path.append(QFileUtils.getFileFormat(name));
|
|
return path.toString();
|
|
}
|
|
@Override
|
public ResFile read(String fileId) {
|
ResFile file = read(ResFile.class, fileId);
|
return file;
|
}
|
|
@Override
|
public String readIdByPath(String path) {
|
|
String hql = "from ResFile where path=? and deleteFlag is false";
|
|
ResFile result = findUnique(hql, CollectionUtils.newList(chopFirstSlash(path)), ResFile.class);
|
|
return result.getFileId();
|
}
|
|
private String chopFirstSlash(String path) {
|
if (path.startsWith("/")) {
|
return path.substring(1);
|
}
|
return path;
|
}
|
|
@Override
|
public InputStream readStreamById(String id) {
|
|
ResFile file = read(id);
|
|
if (null == file) {
|
return null;
|
}
|
|
String absolutePath = config.getResRootPath() + "/" + file.getPath();
|
|
try {
|
return FileUtils.openInputStream(new File(absolutePath));
|
} catch (IOException e) {
|
log.error(e, e);
|
}
|
return null;
|
}
|
|
@Override
|
public Result checkMd5(String md5, String fileName) {
|
// if(StringUtils.isBlank(md5)){
|
// return Result.FAIL;
|
// }
|
//
|
//
|
// Boolean objectExist;
|
// objectExist = authOssService.doseObjectExist(resFile.getPath());
|
//
|
// if (objectExist) {
|
//
|
// ResFileDO resFileToDB = new ResFileDO();
|
// BeanUtils.copyProperties(resFile, resFileToDB);
|
// resFileToDB.setId(null);
|
// TraceUtils.setCreateTrace(resFileToDB);
|
// ResFileDO resFileDB = save(resFileToDB);
|
//
|
// Result result = new Result(true, "fileId", resFileDB.getId(), "path", resFileDB.getPath(),"fileName",fileName,
|
// "fileSize",resFileToDB.getSize(),"fileType",resFileToDB.getFileType(),"hit",true);
|
// result.setResultCode(201);
|
// return result;
|
//
|
// }
|
|
return Result.FAIL;
|
}
|
}
|