FileServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. package com.hz.employmentsite.services.impl.system;
  2. import com.hz.employmentsite.AppConfig;
  3. import com.hz.employmentsite.mapper.CfFileMapper;
  4. import com.hz.employmentsite.mapper.cquery.FileCQuery;
  5. import com.hz.employmentsite.model.CfFile;
  6. import com.hz.employmentsite.model.CfFileExample;
  7. import com.hz.employmentsite.services.service.system.FileService;
  8. import com.hz.employmentsite.util.FtpHelper;
  9. import com.hz.employmentsite.vo.system.FileModel;
  10. import org.apache.commons.net.ftp.FTP;
  11. import org.apache.commons.net.ftp.FTPClient;
  12. import org.apache.commons.net.ftp.FTPFile;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.core.io.ByteArrayResource;
  17. import org.springframework.core.io.Resource;
  18. import org.springframework.http.HttpHeaders;
  19. import org.springframework.http.MediaType;
  20. import org.springframework.http.ResponseEntity;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.web.multipart.MultipartFile;
  23. import java.io.*;
  24. import java.net.URLEncoder;
  25. import java.nio.file.Files;
  26. import java.nio.file.Path;
  27. import java.nio.file.Paths;
  28. import java.time.LocalDateTime;
  29. import java.time.format.DateTimeFormatter;
  30. import java.util.Date;
  31. import java.util.List;
  32. import java.util.UUID;
  33. @Service("FileService")
  34. public class FileServiceImpl implements FileService {
  35. @Autowired
  36. FtpHelper ftpHelper;
  37. @Autowired
  38. private FileCQuery fileCQuery;
  39. @Autowired
  40. private CfFileMapper cfFileMapper;
  41. @Autowired
  42. private AppConfig appConfig;
  43. private final Logger logger;
  44. public FileServiceImpl() {
  45. logger = LoggerFactory.getLogger(this.getClass());
  46. }
  47. public List<FileModel> getList(String fileRefID) {
  48. return fileCQuery.getList(fileRefID);
  49. }
  50. public CfFile getFileByID(String fileID){
  51. return cfFileMapper.selectByPrimaryKey(fileID);
  52. }
  53. @Override
  54. public Integer saveFile(MultipartFile[] files, String fileRefID, Integer fileType, String userId, Integer isSingle) throws Exception {
  55. Integer result = 0;
  56. FTPClient ftpClient = new FTPClient();
  57. //如果是单文件上传,删除原先数据
  58. if (isSingle == 1) {
  59. CfFileExample example = new CfFileExample();
  60. example.or().andFileRefIDEqualTo(fileRefID);
  61. cfFileMapper.deleteByExample(example);
  62. }
  63. for (Integer i = 0; i < files.length; i++) {
  64. MultipartFile file = files[i];
  65. String fileName = file.getOriginalFilename();
  66. byte[] byteArr = file.getBytes();
  67. String fileId = UUID.randomUUID().toString();
  68. String fileSuffix = fileName.indexOf(".") >= 0 ? fileName.substring(fileName.lastIndexOf(".")) : "";
  69. fileName = fileName + this.getFileSuffix(fileSuffix);
  70. ftpHelper.connectToServer(ftpClient);
  71. ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  72. CfFile cfFile = new CfFile();
  73. cfFile.setFileId(fileId);
  74. cfFile.setUserID(userId);
  75. cfFile.setFileType(fileType);
  76. cfFile.setFileRefID(fileRefID);
  77. cfFile.setCreateTime(new Date());
  78. cfFile.setFileSuffix(fileName.indexOf(".") >= 0 ? fileName.substring(fileName.lastIndexOf(".")) : "");
  79. cfFile.setFileName(fileName);
  80. String filePath = createServeDir(cfFile.getCreateTime(), ftpClient);
  81. cfFile.setFileUrl(filePath + "/" + fileId + cfFile.getFileSuffix());
  82. ftpClient.changeWorkingDirectory(filePath);
  83. ftpClient.storeFile(fileId + cfFile.getFileSuffix(), new ByteArrayInputStream(byteArr));
  84. ftpHelper.closeConnect(ftpClient);
  85. result += cfFileMapper.insert(cfFile);
  86. }
  87. return result;
  88. }
  89. private String getFileSuffix(String fileSuffix) {
  90. switch (fileSuffix) {
  91. case ".x-zip-compressed":
  92. fileSuffix = ".zip";
  93. break;
  94. case ".ms-powerpoint":
  95. fileSuffix = ".ppt";
  96. break;
  97. case ".presentation":
  98. fileSuffix = ".pptx";
  99. break;
  100. case ".ms-excel":
  101. fileSuffix = ".xls";
  102. break;
  103. case ".sheet":
  104. fileSuffix = ".xlsx";
  105. break;
  106. case "plain":
  107. fileSuffix = ".txt";
  108. break;
  109. case ".msword":
  110. fileSuffix = ".doc";
  111. break;
  112. case ".document":
  113. fileSuffix = ".docx";
  114. break;
  115. default:
  116. fileSuffix = "";
  117. break;
  118. }
  119. return fileSuffix;
  120. }
  121. public String createServeDir(Date date, FTPClient ftpClient) throws IOException {
  122. String fileDir = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
  123. FTPFile[] ftpFiles = ftpClient.listFiles(fileDir);
  124. if (ftpFiles.length == 0) {
  125. ftpClient.makeDirectory(fileDir);
  126. }
  127. return fileDir;
  128. }
  129. @Override
  130. public CfFile downFtpFile(String fileId, OutputStream os) {
  131. CfFile file = cfFileMapper.selectByPrimaryKey(fileId);
  132. try {
  133. FTPClient ftpClient = new FTPClient();
  134. ftpHelper.connectToServer(ftpClient);
  135. ftpClient.enterLocalPassiveMode();
  136. ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  137. ftpClient.retrieveFile(file.getFileUrl(), os);
  138. ftpHelper.closeConnect(ftpClient);
  139. } catch (Exception ex) {
  140. logger.error("downFtpFile,下载文件失败!", ex);
  141. file = null;
  142. }
  143. return file;
  144. }
  145. @Override
  146. public void downloadTempFile(String fileName, OutputStream os) throws FileNotFoundException {
  147. try {
  148. InputStream inputStream = new FileInputStream(new File(appConfig.staticLocations.replace("file:", "") + "doc/template/" + fileName));
  149. os.write(inputStream.readAllBytes());
  150. os.flush();
  151. } catch (Exception ex) {
  152. logger.error("downloadTempFile,下载文件失败!", ex);
  153. }
  154. }
  155. @Override
  156. public ResponseEntity<Resource> downloadApk() throws IOException {
  157. // 从服务器获取APK文件
  158. String apkFilePath = appConfig.staticLocations.replace("file:", "") + "apk/app.apk";
  159. File apkFile = new File(apkFilePath);
  160. // 创建文件资源对象
  161. Path path = Paths.get(apkFile.getAbsolutePath());
  162. ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));
  163. // 设置下载响应头
  164. HttpHeaders headers = new HttpHeaders();
  165. headers.add(HttpHeaders.CONTENT_TYPE,"application/vnd.android.package-archive");
  166. headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + URLEncoder.encode("惠州市就业驿站管理系统.apk", "UTF-8"));
  167. // 返回文件资源对象和响应头
  168. return ResponseEntity.ok()
  169. .headers(headers)
  170. .contentLength(apkFile.length())
  171. .contentType(MediaType.APPLICATION_OCTET_STREAM)
  172. .body(resource);
  173. }
  174. @Override
  175. public Integer delete(String fileId) throws IOException {
  176. CfFile cfFile = cfFileMapper.selectByPrimaryKey(fileId);
  177. Path filePath = Paths.get(CreateFileFullName(cfFile.getFileUrl()));
  178. if (Files.exists(filePath)) {
  179. Files.delete(filePath);
  180. }
  181. return cfFileMapper.deleteByPrimaryKey(fileId);
  182. }
  183. public String CreateFileFullName(String fileName) {
  184. Path pFileName = Paths.get(appConfig.uploadfileUrl, fileName);
  185. if (!Files.exists(pFileName.getParent())) {
  186. try {
  187. Files.createDirectory(pFileName.getParent());
  188. } catch (IOException ex) {
  189. ex.printStackTrace();
  190. }
  191. }
  192. String FileFullName = pFileName.toString();
  193. return FileFullName;
  194. }
  195. @Override
  196. public String downFtpFileToLocal(String fileId) {
  197. try {
  198. CfFile cfFile = cfFileMapper.selectByPrimaryKey(fileId);
  199. FTPClient ftpClient = new FTPClient();
  200. ftpHelper.connectToServer(ftpClient);
  201. ftpClient.enterLocalPassiveMode();
  202. ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  203. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  204. ftpClient.retrieveFile(cfFile.getFileUrl(), bos);
  205. ftpHelper.closeConnect(ftpClient);
  206. String downPath = "doc\\down\\";
  207. String filePath = appConfig.staticLocations.replace("file:", "") + downPath;
  208. String fileName = cfFile.getFileId() + "-" + UUID.randomUUID().toString() + cfFile.getFileSuffix();
  209. Path dictPath = Paths.get(filePath);
  210. if (!Files.exists(dictPath)) {
  211. Files.createDirectory(dictPath);
  212. }
  213. File file = new File(filePath + fileName);
  214. if (!file.exists()) {
  215. file.createNewFile();
  216. }
  217. FileOutputStream fos = new FileOutputStream(file);
  218. fos.write(bos.toByteArray());
  219. fos.flush();
  220. fos.close();
  221. return downPath + fileName;
  222. } catch (Exception ex) {
  223. logger.error("downFtpFile,下载文件失败!", ex);
  224. return "";
  225. }
  226. }
  227. //<dependency>
  228. // <groupId>commons-fileupload</groupId>
  229. // <artifactId>commons-fileupload</artifactId>
  230. // <version>1.4</version>
  231. // </dependency>
  232. //拷贝文件,未测试
  233. /*public void copyFileByRefID(String sourceRefID, List<String> fileRefIDList, String userId) throws Exception {
  234. List<FileModel> fileList = fileCQuery.getList(sourceRefID);
  235. List<MultipartFile> multipartFiles = new ArrayList<>();
  236. FTPClient ftpClient = new FTPClient();
  237. ftpHelper.connectToServer(ftpClient);
  238. ftpClient.enterLocalPassiveMode();
  239. ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  240. fileList.forEach(item -> {
  241. try {
  242. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  243. ftpClient.retrieveFile(item.getFileUrl(), bos);
  244. FileItemFactory factory = new DiskFileItemFactory(16, null);
  245. FileItem fileItem = factory.createItem(item.getFileName().replace(item.getFileSuffix(), ""), "text/plan", true, item.getFileSuffix().replace(".", ""));
  246. OutputStream os = fileItem.getOutputStream();
  247. os.write(bos.toByteArray());
  248. os.flush();
  249. multipartFiles.add(new CommonsMultipartFile(fileItem));
  250. } catch (IOException e) {
  251. throw new RuntimeException(e);
  252. }
  253. });
  254. ftpHelper.closeConnect(ftpClient);
  255. fileRefIDList.forEach(fileRefID -> {
  256. try {
  257. saveFile((MultipartFile[]) multipartFiles.toArray(), fileRefID, 1, userId);
  258. } catch (Exception e) {
  259. throw new RuntimeException(e);
  260. }
  261. });
  262. }*/
  263. }