SysFileController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. package com.onemap.file.controller;
  2. import com.onemap.common.core.domain.UploadZipDTO;
  3. import com.onemap.common.core.web.domain.RequestResult;
  4. import com.onemap.file.domain.TUploadGeomDTO;
  5. import com.onemap.file.service.ISpaceFileRecordService;
  6. import com.onemap.file.service.SaveFileService;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.core.io.FileSystemResource;
  11. import org.springframework.core.io.Resource;
  12. import org.springframework.http.HttpHeaders;
  13. import org.springframework.http.HttpStatus;
  14. import org.springframework.http.MediaType;
  15. import org.springframework.http.ResponseEntity;
  16. import org.springframework.util.AntPathMatcher;
  17. import org.springframework.web.bind.annotation.*;
  18. import org.springframework.web.multipart.MultipartFile;
  19. import com.onemap.common.core.domain.R;
  20. import com.onemap.common.core.utils.file.FileUtils;
  21. import com.onemap.file.service.ISysFileService;
  22. import com.onemap.system.api.domain.SysFile;
  23. import org.springframework.web.servlet.HandlerMapping;
  24. import javax.servlet.http.HttpServletRequest;
  25. import javax.servlet.http.HttpServletResponse;
  26. import java.io.IOException;
  27. import java.net.URLDecoder;
  28. import java.net.URLEncoder;
  29. import java.nio.file.Files;
  30. import java.nio.file.Path;
  31. import java.nio.file.Paths;
  32. import java.util.ArrayList;
  33. import java.util.List;
  34. /**
  35. * 文件请求处理
  36. *
  37. * @author onemap
  38. */
  39. @RestController
  40. public class SysFileController {
  41. private static final Logger log = LoggerFactory.getLogger(SysFileController.class);
  42. @Autowired
  43. private ISysFileService sysFileService;
  44. @Autowired
  45. private ISpaceFileRecordService spaceFileRecordService;
  46. @Autowired
  47. private SaveFileService saveFileService;
  48. private AntPathMatcher antPathMatcher = new AntPathMatcher();
  49. /**
  50. * 文件上传
  51. *
  52. * @param file 文件
  53. * @param businessType 业务类型
  54. */
  55. @PostMapping("/upload")
  56. public R<SysFile> upload(MultipartFile file, String businessType) {
  57. try {
  58. // 上传并返回访问地址
  59. String url = sysFileService.uploadFile(file, businessType);
  60. SysFile sysFile = new SysFile();
  61. sysFile.setName(FileUtils.getName(url));
  62. sysFile.setUrl(url);
  63. return R.ok(sysFile);
  64. } catch (Exception e) {
  65. log.error("上传文件失败", e);
  66. return R.fail(e.getMessage());
  67. }
  68. }
  69. /**
  70. * 文件上传(大文件分片上传)
  71. *
  72. * @param file
  73. * @param chunk
  74. * @param chunks
  75. * @param name
  76. * @param md5
  77. * @return
  78. */
  79. @PostMapping("/splitFileUpload")
  80. public R<SysFile> splitFileUpload(@RequestParam("file") MultipartFile file, @RequestParam("chunk") int chunk, @RequestParam("chunks") int chunks, @RequestParam("name") String name, @RequestParam("md5") String md5) {
  81. try {
  82. // 上传并返回访问地址
  83. String url = sysFileService.splitFileUpload(file, chunk, chunks, name, md5);
  84. SysFile sysFile = new SysFile();
  85. sysFile.setName(FileUtils.getName(url));
  86. sysFile.setUrl(url);
  87. return R.ok(sysFile);
  88. } catch (Exception e) {
  89. log.error("上传文件失败", e);
  90. return R.fail(e.getMessage());
  91. }
  92. }
  93. /**
  94. * 上传附件,图片
  95. *
  96. * @param files 文件列表
  97. * @return 文件地址集合
  98. */
  99. @PostMapping("/uploadAppendix")
  100. public R<List<SysFile>> uploadAppendix(MultipartFile[] files) {
  101. try {
  102. List<SysFile> sysFileList = new ArrayList<>();
  103. // 上传并返回访问地址
  104. for (MultipartFile file : files) {
  105. String url = sysFileService.uploadAppendix(file);
  106. SysFile sysFile = new SysFile();
  107. sysFile.setName(FileUtils.getName(url));
  108. sysFile.setUrl(url);
  109. sysFileList.add(sysFile);
  110. }
  111. return R.ok(sysFileList);
  112. } catch (Exception e) {
  113. log.error("上传文件失败", e);
  114. return R.fail(e.getMessage());
  115. }
  116. }
  117. /**
  118. * shp压缩包文件上传
  119. *
  120. * @param file 文件
  121. */
  122. @PostMapping("/saveGeom")
  123. public RequestResult saveGeom(MultipartFile file, Integer fromType, String geom, String fromRoute) {
  124. try {
  125. RequestResult res = null;
  126. if (fromType == 1) {
  127. String id = saveFileService.saveDraw(geom, fromRoute);
  128. res = RequestResult.success("上传成功", saveFileService.getById(id));
  129. } else {
  130. res = sysFileService.uploadShpZip(file, fromRoute);
  131. }
  132. return res;
  133. } catch (Exception e) {
  134. e.printStackTrace();
  135. return RequestResult.error("上传失败!", null);
  136. }
  137. }
  138. // /**
  139. // * shp压缩包文件上传****智慧选址
  140. // *
  141. // * @param file 文件
  142. // */
  143. // @PostMapping("/uploadZhxzZip")
  144. // public RequestResult uploadZhxzZip(MultipartFile file) {
  145. // try {
  146. // RequestResult res = sysFileService.uploadZhxzZip(file);
  147. // return res;
  148. // } catch (Exception e) {
  149. // e.printStackTrace();
  150. // return RequestResult.error("上传失败!", null);
  151. // }
  152. // }
  153. /**
  154. * 压缩包文件上传
  155. *
  156. * @param file 文件
  157. */
  158. @PostMapping("/uploadZip")
  159. public UploadZipDTO uploadZip(MultipartFile file) {
  160. try {
  161. UploadZipDTO res = sysFileService.uploadZip(file);
  162. return res;
  163. } catch (Exception e) {
  164. e.printStackTrace();
  165. return new UploadZipDTO();
  166. }
  167. }
  168. // /**
  169. // * shp压缩包文件上传
  170. // *
  171. // * @param file 文件
  172. // */
  173. // @PostMapping("/uploadTgcl")
  174. // public GhtgCl uploadTgcl(MultipartFile file, Integer type) {
  175. // try {
  176. // GhtgCl res = sysFileService.uploadTgcl(file, type);
  177. // return res;
  178. // } catch (Exception e) {
  179. // e.printStackTrace();
  180. // return null;
  181. // }
  182. // }
  183. /**
  184. * 获取shp文件相应的geojson
  185. */
  186. @GetMapping("/getShpGeoJson")
  187. public String getShpGeoJson(String shpfile) {
  188. try {
  189. String res = sysFileService.getShpGeoJson(shpfile);
  190. return res;
  191. } catch (Exception e) {
  192. e.printStackTrace();
  193. return null;
  194. }
  195. }
  196. /**
  197. * 根空间相关的上传出来
  198. * 现支持shp的zip包,ewkt字符串
  199. *
  200. * @param file shp的zip文件
  201. * @param fromType 上传的类型 1 ewkt 2 shp的zip文件
  202. * @param geom wkt字符串(如果没设置srid,默认为4326)
  203. * @param fromRoute 来源
  204. */
  205. @PostMapping("/upload/geom")
  206. public RequestResult uploadGeom(MultipartFile file, Integer fromType, String geom, String fromRoute) {
  207. try {
  208. RequestResult res = null;
  209. if (fromType == 1) {
  210. res = spaceFileRecordService.uploadAddShpDraw(geom, fromRoute);
  211. } else {
  212. res = spaceFileRecordService.uploadAddShpFile(file, fromRoute);
  213. }
  214. return res;
  215. } catch (Exception e) {
  216. e.printStackTrace();
  217. return RequestResult.error("上传失败!", null);
  218. }
  219. }
  220. @GetMapping("/upload/geom/query")
  221. public RequestResult uploadGeomQuery(String id, Integer isDetail) {
  222. return RequestResult.success("执行成功!", spaceFileRecordService.querySpaceFileRecord(id, isDetail));
  223. }
  224. /**
  225. * @param storeStats 是否入库 0入库 其他不入库
  226. * @return
  227. * @throws Exception
  228. */
  229. @PostMapping("/upload/geom/v1")
  230. public RequestResult uploadGeomV1(MultipartFile file, Integer fromType, String geom, String fromRoute, String storeStats, Integer followup) {
  231. try {
  232. String id;
  233. if (fromType == 1) {
  234. id = spaceFileRecordService.uploadAddShpDrawV1(geom, fromRoute, fromType, storeStats);
  235. } else {
  236. id = spaceFileRecordService.uploadAddShpFileV1(file, fromRoute, fromType, storeStats);
  237. }
  238. TUploadGeomDTO dto = spaceFileRecordService.selectTUploadGeomById(id, 0);
  239. if (null != followup) {
  240. spaceFileRecordService.handleUploadGeomFollowUp(id, followup);
  241. }
  242. if (!"0".equals(storeStats)) {
  243. spaceFileRecordService.deleteTUploadGeomById(id);
  244. }
  245. return RequestResult.success(dto);
  246. } catch (Exception e) {
  247. return RequestResult.error("上传失败!", null);
  248. }
  249. }
  250. /**
  251. * 根据ID查询空间信息,
  252. *
  253. * @param id
  254. * @param isDetail 是否查询详情,1是 其他否
  255. * @return
  256. * @throws Exception
  257. */
  258. @GetMapping("/upload/geom/v1/query")
  259. public RequestResult uploadGeomQueryV1(String id, Integer isDetail) {
  260. return RequestResult.success("执行成功!", spaceFileRecordService.selectTUploadGeomById(id, isDetail));
  261. }
  262. @GetMapping("/upload/geom/v1/query/details")
  263. public RequestResult uploadGeomQueryV1(String id) {
  264. return RequestResult.success("执行成功!", spaceFileRecordService.selectTUploadGeomDetailsById(id));
  265. }
  266. /**
  267. * 文件预览
  268. *
  269. * @param request
  270. * @param response
  271. * @return
  272. */
  273. @GetMapping("/upload/inline/**")
  274. public ResponseEntity<Resource> uploadInline(HttpServletRequest request, HttpServletResponse response) {
  275. try {
  276. String path = request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
  277. String bestMatchingPattern = request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();
  278. // 提取与模式相匹配的部分(不包括通配符)
  279. String extractedPath = antPathMatcher.extractPathWithinPattern(bestMatchingPattern, path);
  280. String uploadFile = spaceFileRecordService.uploadAbsolutePath(URLDecoder.decode(extractedPath, "UTF-8"));
  281. // 构建文件的完整路径
  282. Path filePath = Paths.get(uploadFile);
  283. Resource resource = new FileSystemResource(filePath.toFile());
  284. // 如果资源不存在,返回404
  285. if (!resource.exists()) {
  286. return ResponseEntity.notFound().build();
  287. }
  288. // 获取文件MIME类型
  289. String contentType = Files.probeContentType(filePath);
  290. if (contentType == null) {
  291. // 如果无法确定MIME类型,则使用默认值
  292. contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
  293. }
  294. // 设置HTTP头部信息
  295. HttpHeaders headers = new HttpHeaders();
  296. headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + URLEncoder.encode(resource.getFilename(), "UTF-8") + "\"");
  297. // headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"");
  298. headers.setContentType(MediaType.parseMediaType(contentType));
  299. headers.setAccessControlAllowOrigin("*");
  300. // 返回文件资源
  301. return ResponseEntity.ok().headers(headers).contentLength(Files.size(filePath)) // 可选:设置内容长度
  302. .body(resource);
  303. } catch (IOException e) {
  304. // 处理IO异常,例如文件不存在或无法读取
  305. // e.printStackTrace();
  306. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
  307. }
  308. }
  309. /**
  310. * 文件下载
  311. *
  312. * @param request
  313. * @param response
  314. * @return
  315. */
  316. @GetMapping("/upload/attachment/**")
  317. public ResponseEntity<Resource> uploadAttachment(HttpServletRequest request, HttpServletResponse response) {
  318. try {
  319. String path = request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
  320. String bestMatchingPattern = request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();
  321. // 提取与模式相匹配的部分(不包括通配符)
  322. String extractedPath = antPathMatcher.extractPathWithinPattern(bestMatchingPattern, path);
  323. String uploadFile = spaceFileRecordService.uploadAbsolutePath(URLDecoder.decode(extractedPath, "UTF-8"));
  324. // 构建文件的完整路径
  325. Path filePath = Paths.get(uploadFile);
  326. Resource resource = new FileSystemResource(filePath.toFile());
  327. // 如果资源不存在,返回404
  328. if (!resource.exists()) {
  329. return ResponseEntity.notFound().build();
  330. }
  331. // 获取文件MIME类型
  332. String contentType = Files.probeContentType(filePath);
  333. if (contentType == null) {
  334. // 如果无法确定MIME类型,则使用默认值
  335. contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
  336. }
  337. // 设置HTTP头部信息
  338. HttpHeaders headers = new HttpHeaders();
  339. // headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + URLEncoder.encode(resource.getFilename(), "UTF-8") + "\"");
  340. headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + URLEncoder.encode(resource.getFilename() + "\""));
  341. headers.setContentType(MediaType.parseMediaType(contentType));
  342. headers.setAccessControlAllowOrigin("*");
  343. // 返回文件资源
  344. return ResponseEntity.ok().headers(headers).contentLength(Files.size(filePath)) // 可选:设置内容长度
  345. .body(resource);
  346. } catch (IOException e) {
  347. // 处理IO异常,例如文件不存在或无法读取
  348. // e.printStackTrace();
  349. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
  350. }
  351. }
  352. }