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 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; } }