From ac9a7c884012a4571b58f075fa2c6647b2f9886f Mon Sep 17 00:00:00 2001 From: "DESKTOP-G8BCEP0\\HP" <2037158277@qq.com> Date: Tue, 14 Sep 2021 13:56:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=88=B0=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=92=8C=E6=9F=A5=E7=9C=8B=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 17 + .../xkrs/common/config/WebSecurityConfig.java | 2 + .../com/xkrs/controller/FileController.java | 116 +++++ src/main/java/com/xkrs/dao/FilePathDao.java | 21 + .../java/com/xkrs/model/entity/FilePath.java | 135 +++++ .../xkrs/service/impl/SysUserServiceImpl.java | 2 - .../java/com/xkrs/utils/DateTimeUtil.java | 8 + src/main/java/com/xkrs/utils/FileFastDfs.java | 477 ++++++++++++++++++ src/main/java/com/xkrs/utils/FileUtil.java | 314 ++++++++---- src/main/resources/application.properties | 7 +- 10 files changed, 1000 insertions(+), 99 deletions(-) create mode 100644 src/main/java/com/xkrs/controller/FileController.java create mode 100644 src/main/java/com/xkrs/dao/FilePathDao.java create mode 100644 src/main/java/com/xkrs/model/entity/FilePath.java create mode 100644 src/main/java/com/xkrs/utils/FileFastDfs.java diff --git a/pom.xml b/pom.xml index 23bc21a..e959735 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,8 @@ 5.0.0 5.0.0 2.0.4 + 4.4.3 + 0.4.0 @@ -214,6 +216,21 @@ aliyun-java-sdk-dysmsapi 1.1.0 + + cn.hutool + hutool-all + ${hutool-all.version} + + + io.tus.java.client + tus-java-client + ${tus-client.version} + + + org.springframework.kafka + spring-kafka + 2.5.10.RELEASE + diff --git a/src/main/java/com/xkrs/common/config/WebSecurityConfig.java b/src/main/java/com/xkrs/common/config/WebSecurityConfig.java index 7943196..601e796 100644 --- a/src/main/java/com/xkrs/common/config/WebSecurityConfig.java +++ b/src/main/java/com/xkrs/common/config/WebSecurityConfig.java @@ -55,6 +55,8 @@ class WebSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers(HttpMethod.GET,"/selectFirePoint").permitAll() .antMatchers(HttpMethod.POST,"/updateTypeByFireCode").permitAll() .antMatchers(HttpMethod.GET,"/api/user/verificationCode").permitAll() + .antMatchers(HttpMethod.POST,"/uploadFileMore").permitAll() + .antMatchers(HttpMethod.POST,"/uploadFile").permitAll() // 所有其它请求需要身份认证 .anyRequest().authenticated() .and() diff --git a/src/main/java/com/xkrs/controller/FileController.java b/src/main/java/com/xkrs/controller/FileController.java new file mode 100644 index 0000000..1e63f62 --- /dev/null +++ b/src/main/java/com/xkrs/controller/FileController.java @@ -0,0 +1,116 @@ +package com.xkrs.controller; + +import com.xkrs.common.encapsulation.PromptMessageEnum; +import com.xkrs.dao.FilePathDao; +import com.xkrs.model.entity.FilePath; +import com.xkrs.utils.FileFastDfs; +import com.xkrs.utils.FileUtil; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import static com.xkrs.common.encapsulation.OutputEncapsulation.outputEncapsulationObject; +import static com.xkrs.utils.FileUtil.getUploadInfo; + +/** + * @author XinYi Song + * 文件上传 + */ +@RestController +public class FileController { + + @Resource + private FileFastDfs fileFastDfs; + + @Resource + private FilePathDao filePathDao; + + /** + * 上传多张图片 + * @param files + * @return + */ + @PostMapping("/uploadFileMore") + public String uploadFileMore(MultipartFile[] files){ + Locale locale = LocaleContextHolder.getLocale(); + if (null == files || files.length == 0){ + return outputEncapsulationObject(PromptMessageEnum.PARAM_NULL, "result or fileType is null", locale); + } + List list = new ArrayList(); + for (MultipartFile file : + files) { + boolean m = FileUtil.checkFileSize(file.getSize(), 100, "M"); + if(m == false){ + return outputEncapsulationObject(PromptMessageEnum.DATA_WRONG, "图片大小不能超过100M", locale); + } + String dir = "fire_point"; + String info = fileFastDfs.uploadFile(file, dir); + Map map = getUploadInfo(info); + FilePath filePath = new FilePath(); + filePath.setFilePath(map.get("path")); + filePath.setFileName(map.get("fileName")); + filePath.setSize(map.get("size")); + filePath.setMtime(map.get("mtime")); + filePath.setUrl(map.get("url")); + filePath.setMd5(map.get("md5")); + filePath.setScene(map.get("scene")); + filePathDao.save(filePath); + } + //List> path = filePathDao.findPath(); + return outputEncapsulationObject(PromptMessageEnum.SUCCESS, "上传成功!", locale); + } + + /** + * 上传单张图片 + * @param file + * @return + */ + @PostMapping("/uploadFile") + public String uploadFile(MultipartFile file){ + Locale locale = LocaleContextHolder.getLocale(); + if (null == file){ + return outputEncapsulationObject(PromptMessageEnum.PARAM_NULL, "result or fileType is null", locale); + } + boolean m = FileUtil.checkFileSize(file.getSize(), 100, "M"); + if(m == false){ + return outputEncapsulationObject(PromptMessageEnum.DATA_WRONG, "图片大小不能超过100M", locale); + } + String dir = "fire_point"; + String info = fileFastDfs.uploadFile(file, dir); + Map map = getUploadInfo(info); + FilePath filePath = new FilePath(); + filePath.setFilePath(map.get("path")); + filePath.setFileName(map.get("fileName")); + filePath.setSize(map.get("size")); + filePath.setMtime(map.get("mtime")); + filePath.setUrl(map.get("url")); + filePath.setMd5(map.get("md5")); + filePath.setScene(map.get("scene")); + filePathDao.save(filePath); + //List> path = filePathDao.findPath(); + return outputEncapsulationObject(PromptMessageEnum.SUCCESS, "上传成功!", locale); + } + + /** + * 查询火点图片路径 + * @return + */ + @GetMapping("/findPath") + public String findPath(){ + Locale locale = LocaleContextHolder.getLocale(); + List> path = filePathDao.findPath(); + if(path == null || path.size() == 0){ + return outputEncapsulationObject(PromptMessageEnum.DATA_NONE, "还未上传任何图片信息!", locale); + } + return outputEncapsulationObject(PromptMessageEnum.SUCCESS, path, locale); + } +} diff --git a/src/main/java/com/xkrs/dao/FilePathDao.java b/src/main/java/com/xkrs/dao/FilePathDao.java new file mode 100644 index 0000000..f4412f4 --- /dev/null +++ b/src/main/java/com/xkrs/dao/FilePathDao.java @@ -0,0 +1,21 @@ +package com.xkrs.dao; + +import com.xkrs.model.entity.FilePath; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; +import java.util.Map; + +/** + * @author XinYi Song + */ +public interface FilePathDao extends JpaRepository { + + /** + * 查询全部路径 + * @return + */ + @Query(value = "select file_path filepath from file_path",nativeQuery = true) + List> findPath(); +} diff --git a/src/main/java/com/xkrs/model/entity/FilePath.java b/src/main/java/com/xkrs/model/entity/FilePath.java new file mode 100644 index 0000000..6581133 --- /dev/null +++ b/src/main/java/com/xkrs/model/entity/FilePath.java @@ -0,0 +1,135 @@ +package com.xkrs.model.entity; + +import javax.persistence.*; + +/** + * @author XinYi Song + */ +@Entity +@Table(name = "file_path") +public class FilePath { + + /** + * 主键id + */ + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "file_path_seq_gen") + @SequenceGenerator(name = "file_path_seq_gen", sequenceName = "file_path_id_seq",allocationSize = 1) + private Integer id; + + /** + * 图片路径 + */ + @Column(length = 500,columnDefinition = "varchar(500)") + private String filePath; + + @Column(length = 88,columnDefinition = "varchar(88)") + private String fileName; + + @Column(length = 65,columnDefinition = "varchar(65)") + private String size; + + @Column(length = 85,columnDefinition = "varchar(85)") + private String mtime; + + @Column(length = 88,columnDefinition = "varchar(88)") + private String url; + + @Column(length = 85,columnDefinition = "varchar(85)") + private String md5; + + @Column(length = 65,columnDefinition = "varchar(65)") + private String scene; + + public FilePath() { + } + + public FilePath(Integer id, String filePath, String fileName, String size, String mtime, String url, String md5, String scene) { + this.id = id; + this.filePath = filePath; + this.fileName = fileName; + this.size = size; + this.mtime = mtime; + this.url = url; + this.md5 = md5; + this.scene = scene; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getMtime() { + return mtime; + } + + public void setMtime(String mtime) { + this.mtime = mtime; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMd5() { + return md5; + } + + public void setMd5(String md5) { + this.md5 = md5; + } + + public String getScene() { + return scene; + } + + public void setScene(String scene) { + this.scene = scene; + } + + @Override + public String toString() { + return "FilePath{" + + "id=" + id + + ", filePath='" + filePath + '\'' + + ", fileName='" + fileName + '\'' + + ", size='" + size + '\'' + + ", mtime='" + mtime + '\'' + + ", url='" + url + '\'' + + ", md5='" + md5 + '\'' + + ", scene='" + scene + '\'' + + '}'; + } +} diff --git a/src/main/java/com/xkrs/service/impl/SysUserServiceImpl.java b/src/main/java/com/xkrs/service/impl/SysUserServiceImpl.java index 4c9922f..73f38a4 100644 --- a/src/main/java/com/xkrs/service/impl/SysUserServiceImpl.java +++ b/src/main/java/com/xkrs/service/impl/SysUserServiceImpl.java @@ -117,8 +117,6 @@ public class SysUserServiceImpl implements SysUserService { relRoleAuthorityDao.save(relRoleAuthorityEntity); return outputEncapsulationObject(PromptMessageEnum.SUCCESS,"注册成功!",locale); - - //sysRoleDao.insertRelUserRole(sysUserEntity.getUserName(),"role_general_user"); } /** diff --git a/src/main/java/com/xkrs/utils/DateTimeUtil.java b/src/main/java/com/xkrs/utils/DateTimeUtil.java index 0e311e5..32d0e4f 100644 --- a/src/main/java/com/xkrs/utils/DateTimeUtil.java +++ b/src/main/java/com/xkrs/utils/DateTimeUtil.java @@ -167,6 +167,14 @@ public class DateTimeUtil { return timeStamp; } + /** + * 获取当前时间 yyyy-MM-ss hh:mm:ss + * @return + */ + public static String getNowTimeStr(){ + return COMMON_FORMATTER_DATETIME.format(getNowTime()); + } + /** * 判断日期格式是否合法 "yyyy-MM-dd" * @param strDate diff --git a/src/main/java/com/xkrs/utils/FileFastDfs.java b/src/main/java/com/xkrs/utils/FileFastDfs.java new file mode 100644 index 0000000..2ec28d9 --- /dev/null +++ b/src/main/java/com/xkrs/utils/FileFastDfs.java @@ -0,0 +1,477 @@ +package com.xkrs.utils; + +import cn.hutool.core.io.resource.InputStreamResource; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.tus.java.client.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.HashMap; +import java.util.Objects; + +/** + * @author dong + * @date 2020/12/31 + */ +@Component +public class FileFastDfs { + + @Value("${dfs.ip}") + public String ip; + @Value("${dfs.port}") + public String port; + +// @Value("${dfs.upload}") +// public String upload; +// +// @Value("${dfs.delete}") +// public String delete; + + @Resource + private KafkaTemplate kafkaTemplate; + private static final Logger log = LoggerFactory.getLogger(FileFastDfs.class); + private static final String STATUS = "status"; + private static final String UPLOAD_BIG_PATH = "http://192.168.2.166:2001/group1/big/upload"; + private static final String UPLOAD_PATH = "http://192.168.2.166:2001/group1/upload"; + + /** + * 文件上传到dfs服务器 + * @param file + * @param dir + * @return + */ + public String uploadFile(MultipartFile file, String dir) { + File file1 = null; + InputStreamResource isr = null; + try { + file1 = multipartFileToFile(file); + isr=new InputStreamResource(file.getInputStream(), + file.getOriginalFilename()); + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + } catch (Exception e) { + e.printStackTrace(); + } + //文件地址 + //声明参数集合 + HashMap paramMap = new HashMap<>(7); + //文件 + paramMap.put("file", isr); + //输出 + paramMap.put("output", "json"); + //自定义路径 + paramMap.put("path", dir); + //场景 文件分类 + if (null == file1) { + return null; + } + String name = file1.getName(); + System.err.println("file:" + file1.getName()); + paramMap.put("scene", name.substring(name.lastIndexOf(".") + 1)); + paramMap.put("fileName", System.currentTimeMillis() + "" + + Objects.requireNonNull(file.getOriginalFilename()) + .substring(file.getOriginalFilename().lastIndexOf("."))); + System.err.println(paramMap); + // + String result = HttpUtil.post("http://" + ip + ":" + port + "/group1/upload", paramMap); + System.err.println(result); + + // 拿出状态码,判断上传状态 + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = null; + try { + node = mapper.readTree(result); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + final String fail = "fail"; + if (null != node) { + if (fail.equals(node.path(STATUS).asText())) { + return null; + } + } + return result; + } + + /** + * @description: 文件上传到dfs服务器 + * @params [file:File 文件, dir 文件存放路径] + * @author: wd + * @time: 2020/3/31 2020/3/31 + */ + public String uploadFile(File file, String dir) { + //文件地址 + //声明参数集合 + HashMap paramMap = new HashMap<>(7); + //文件 + paramMap.put("file", file); + //输出 + paramMap.put("output", "json"); + //自定义路径 + paramMap.put("path", dir); + //场景 +// System.err.println(file.getName()); + + // paramMap.put("fileName", System.currentTimeMillis() + "" + file.getName().substring(file.getName().lastIndexOf("."))); + paramMap.put("fileName", file.getName()); + System.err.println(paramMap); + //上传 + String result = HttpUtil.post("http://" + ip + ":" + port + "/group1/upload", paramMap); + System.err.println(result); + // 拿出状态码,判断上传状态 + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = null; + try { + node = mapper.readTree(result); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + final String status = "status"; + final String statusFail = "fail"; + if (null != node) { + if (statusFail.equals(node.path(status).asText())) { + return null; + } + } + return result; + } + + /** + * @description: 文件上传到dfs服务器 + * @params [file:File 文件, dir 文件存放路径] + * @author: wd + * @time: 2020/3/31 2020/3/31 + */ + public String uploadFile(File file, String dir, String fileType) { + //文件地址 + //声明参数集合 + HashMap paramMap = new HashMap<>(7); + //文件 + paramMap.put("file", file); + //输出 + paramMap.put("output", "json"); + //自定义路径 + paramMap.put("path", dir); + //场景 + System.err.println(file.getName()); + + // paramMap.put("fileName", System.currentTimeMillis() + "" + file.getName().substring(file.getName().lastIndexOf("."))); + paramMap.put("fileName", file.getName()); + paramMap.put("scene", fileType); + System.err.println(paramMap); + //上传 + String result = HttpUtil.post("http://" + ip + ":" + port + "/group1/upload", paramMap); + System.err.println(result); + // 拿出状态码,判断上传状态 + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = null; + try { + node = mapper.readTree(result); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + final String status = "status"; + final String statusFail = "fail"; + if (null != node) { + if (statusFail.equals(node.path(status).asText())) { + return null; + } + } + return result; + } + + public String uploadBigFile(File file, String dir, String fileType) { + // 下面这个一定要注意,如果不设置为true,将会直接返回301 + System.setProperty("http.strictPostRedirect", Boolean.toString(true)); + TusClient tusClient = new TusClient(); + try { + tusClient.setUploadCreationURL(new URL(UPLOAD_BIG_PATH)); + +// tusClient.enableResuming(new TusRedisUrlStrore()); + tusClient.enableResuming(new TusURLMemoryStore()); + + final TusUpload upload = new TusUpload(file); + System.out.println("start upload......"); + TusExecutor executor = new TusExecutor() { + @Override + protected void makeAttempt() throws ProtocolException, IOException { + TusUploader uploader = tusClient.resumeOrCreateUpload(upload); + uploader.setChunkSize(1024 * 1024); + + long start = System.currentTimeMillis(); + do { + long totalBytes = upload.getSize(); + long bytesUploaded = uploader.getOffset(); + double progress = (double) bytesUploaded / totalBytes * 100; + + System.out.printf("Upload at %06.2f%%.\n", progress); + } while (uploader.uploadChunk() > -1); + + uploader.finish(); + + String uploadUrl = uploader.getUploadURL().toString(); + System.out.println("Upload finished."); + System.out.format("Upload available at: %s\n", uploadUrl); + + long end = System.currentTimeMillis(); + + System.out.println((end - start) + "ms"); + // 使用hutool进行秒传置换url + String fileId = StrUtil.subAfter(uploadUrl, UPLOAD_BIG_PATH + "/", true); + System.out.println("fileId: " + fileId); + String url = StrUtil.format("{}?md5={}&output=json", UPLOAD_PATH, fileId); + System.out.println("url: " + url); + // 上传大文件的时候(1.xG)需要sleep一下,要不然会有问题 + ThreadUtil.sleep(5000); + String result = HttpUtil.get(url); + } + }; + executor.makeAttempts(); + } catch (IOException | ProtocolException e) { + e.printStackTrace(); + } + return null; + } + + /** + * @description: 文件base64流获取 + * @params [fileName : 文件路径] + * @return: java.lang.String + * @author: chqf + * @time: 2020/3/31 2020/3/31 + */ + public String getBase64(String fileName) { + if (fileName == null || "".equals(fileName)) { + return null; + } + InputStream fis = null; + URL url = null; + try { + url = new URL("http://" + ip + ":" + port + "/" + URLEncoder.encode(fileName, StandardCharsets.UTF_8)); + System.err.println(url); + fis = url.openStream(); + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + } + final ByteArrayOutputStream data = new ByteArrayOutputStream(); + String imgStr = ""; + try { + if (fis == null) { + return null; + } + int len = -1; + byte[] buf = new byte[2048]; + while (-1 != (len = fis.read(buf, 0, buf.length))) { + data.write(buf, 0, len); + } + Base64.Encoder encoder = Base64.getEncoder(); + imgStr = encoder.encodeToString(data.toByteArray()); + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + }finally { + try { + if (null != fis) { + fis.close(); + } + data.close(); + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + } + } + + return "data:image/jpeg;base64," + imgStr; + } + + /** + * @description: 文件格式转换multipartFil 转为 File 格式 + * @params [file] + * @return: java.io.File + * @author: dong + * @time: 2020/3/31 2020/3/31 + */ + public File multipartFileToFile(MultipartFile file) throws Exception { + + File toFile = null; + if ("".equals(file) || file.getSize() <= 0) { + file = null; + } else { + InputStream ins; + ins = file.getInputStream(); + toFile = new File(Objects.requireNonNull(file.getOriginalFilename())); + inputStreamToFile(ins, toFile); + ins.close(); + } + return toFile; + } + + private static void inputStreamToFile(InputStream ins, File file) { + OutputStream os = null; + try { + os = new FileOutputStream(file); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + }finally { + try { + if (null != os) { + os.close(); + } + if (null != ins) { + ins.close(); + } + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + } + } + } + + /** + * @description: 文件base64流获取 + * @params [fileName : 文件路径] + * @return: java.lang.String + * @author: dong + * @time: 2020/3/31 2020/3/31 + */ + public Boolean getFile(String fileName, HttpServletResponse response) { + if (fileName == null || "".equals(fileName)) { + return null; + } + InputStream fis = null; + URL url = null; + try { + url = new URL("http://" + ip + ":" + port + "/" + URLEncoder.encode(fileName, StandardCharsets.UTF_8)); + System.err.println(url); + fis = url.openStream(); + response.reset(); + response.setContentType("bin"); + response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + } + // + byte[] b = new byte[256]; + int len; + try { + assert fis != null; + while ((len = fis.read(b)) > 0){ + response.getOutputStream().write(b, 0, len); + } + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + }finally { + try { + if (null != fis) { + fis.close(); + } + } catch (IOException e) { + log.info("IO错误{}", (Object) e.getStackTrace()); + } + } + return true; + } + + /** + * 删除文件 path + * @param filePath 文件路径 上传返回的path + * @return + */ + public Boolean deleteFileByPath(String filePath) { + if (filePath == null || "".equals(filePath)) { + return false; + } + HashMap paramMap = new HashMap<>(1); + // 参数 + paramMap.put("path", filePath); + + String result = HttpUtil.post("http://" + ip + ":" + port + "/group1/delete", paramMap); + System.out.println(result); + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = null; + try { + node = mapper.readTree(result); + } catch (JsonProcessingException e) { + + e.printStackTrace(); + } + + final String statusOk = "ok"; + + if (null == node) { + log.error("返回结果为空"); + return false; + } + if (!statusOk.equals(node.path(STATUS).asText())) { + log.error("未删除成功"); + return false; + } + return true; + } + + /** + * 删除文件 path + * @param md5 上传返回的md5 + * @return + */ + public Boolean deleteFileByMd5(String md5) { + if (md5 == null || "".equals(md5)) { + return false; + } + HashMap paramMap = new HashMap<>(1); + // 参数 + paramMap.put("md5", md5); + + String result = HttpUtil.post("http://" + ip + ":" + port + "/group1/delete", paramMap); + + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = null; + try { + node = mapper.readTree(result); + } catch (JsonProcessingException e) { + + e.printStackTrace(); + } + final String status = "status"; + final String statusOk = "ok"; + + if (null == node) { + log.error("返回结果为空"); + return false; + } + if (!statusOk.equals(node.path(status).asText())) { + log.error("未删除成功"); + return false; + } + return true; + } + + + + + + public static void main(String[] args) { + File file = new File("C:\\Users\\dong\\Desktop\\遥感影像\\遥感影像\\GF1\\GF1_PMS1_E116.8_N36.6_20190528_L1A0004026837-MSS1_ORTHO_MS.tif"); + FileFastDfs fileFastDfs = new FileFastDfs(); + } +} + + diff --git a/src/main/java/com/xkrs/utils/FileUtil.java b/src/main/java/com/xkrs/utils/FileUtil.java index 02838c2..ac0a3bd 100644 --- a/src/main/java/com/xkrs/utils/FileUtil.java +++ b/src/main/java/com/xkrs/utils/FileUtil.java @@ -1,127 +1,251 @@ package com.xkrs.utils; -import org.apache.commons.codec.binary.Base64; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.xkrs.utils.DateTimeUtil.getNowTimeStr; -/** - * @author XinYi Song - */ public class FileUtil { + private static final Logger log = LoggerFactory.getLogger(FileUtil.class); + /** - * 根据base64判断图片是否为tiff - * @param base64 + * 判断目录是否存在, 不存在创建 + * @param path 路径,目录最后带 File.separator * @return */ - public boolean checkImageBase64Format(String base64) { - byte[] b=java.util.Base64.getDecoder().decode(base64); - try { - // 判断是否为tiff格式 - if((b[0] & 0xFF) == 0x49 && (b[1] & 0xFF)==0x49 && (b[2] & 0xFF)==0x2A){ - return true; - }else { - return false; - } - }catch(Exception e) { - e.printStackTrace(); + public static boolean isFileExit(String path){ + path = path.replace("/",File.separator); + File file = new File(path); + if (file.exists()) { + log.info("文件已存在"); + return true; + } + if(path.endsWith(File.separator)) { + log.info("创建单个文件" + path + "失败,目标不能是目录!"); return false; } - } - - /** - * 根据BASE64字符串生成图片文件,此方法生成tiff格式 - * @param base64 - * @param fileName - * @param dictionary - */ - public void base64ToFile(String base64,String fileName,String dictionary) { - File file =null; - File dir=new File(dictionary); - // 无目录的情况下创建一个目录,会受权限影响,最好是已存在的目录 - if(!dir.exists() && dir.isDirectory()) { - dir.mkdirs(); - } - FileOutputStream fos=null; - BufferedOutputStream bos=null; - - try { - byte [] bytes=java.util.Base64.getDecoder().decode(base64); - //目录+文件名作为输出文件的全路径 - file=new File(dictionary+fileName); - fos= new FileOutputStream(file); - bos=new BufferedOutputStream(fos); - bos.write(bytes); - }catch(Exception e) { - e.printStackTrace(); - }finally { - if(bos!=null) { - try { - bos.close(); - }catch(IOException e) { - e.printStackTrace(); + if(!file.getParentFile().exists()) { + log.info("目标文件所在路径不存在,准备创建。。。"); + if (file.getParentFile().mkdirs()) { + if (file.mkdir()) { + log.info("创建目录文件成功!"); } } - if(fos!=null) { - try { - fos.close(); - }catch(IOException e) { - e.printStackTrace(); - } + } else { + log.info("目标文件所在路径存在"); + if (file.mkdir()) { + log.info("创建目录文件成功!"); } } - - + return true; } - /** - * 将tiff图片转化为jpg,生成新的文件 - * @param oldPath 原图片的全路径 - * @param newPath 生成新的图片的全路径 + * 获取目录下的所有文件 + * @param filePath 目录 + * @return + * @throws Exception */ - public void tiffToJpg(String oldPath,String newPath) { - try { - BufferedImage bufferegImage= ImageIO.read(new File(oldPath)); - //可以是png等其它图片格式 - ImageIO.write(bufferegImage,"jpg",new File(newPath)); - - }catch(IOException e) { - e.printStackTrace(); + public static List showListFile(String filePath) { + File dir = new File(filePath); + List list = new ArrayList<>(); + // 查找参数文件是否存在,只检查第一个入参 + if(!dir.exists()) { + log.error("找不到文件"); } + // 如果是目录那么进行递归调用 + if(dir.isDirectory()) { + // 获取目录下的所有文件 + File[] f = dir.listFiles(); + // 进行递归调用,最后总会返回一个list + assert f != null; + for (File file : f) { + list.addAll(showListFile(file.getPath())); + } + }else { + // 不是目录直接添加进去,判断是否为xml文件 + list.add(dir.getPath()); + } + return list; } /** - * 将任意图片文件转为base64,读字节是最快的方式 - * @param filePath 图片文件的全路径 + * 移动文件到目标目录 + * @param path 文件路径 * @return */ - public String imageToBase64(String filePath) { - byte [] data =null; - try { - InputStream in =new FileInputStream(filePath); - data=new byte[in.available()]; - in.read(data); - in.close(); - }catch(Exception e) { - e.printStackTrace(); + /*public static FileEntity mvFile(String path){ + String savePath = "D:" + File.separator + "dms" + File.separator + "data" ; + + File file = new File(path); + if (!file.isFile()) { + log.info("{}不是文件。",path); return null; } + // 从文件名获取到入库信息 暂时不知道 + String[] infos = path.split("/"); + String fileNameUnHandler = infos[infos.length - 1]; + String[] fileNameUnHandlerSplitWithPoint = fileNameUnHandler.split("."); + String fileName = fileNameUnHandlerSplitWithPoint[0]; + String scene = fileNameUnHandlerSplitWithPoint[1]; + String[] fileNames = fileNameUnHandler.split("_"); + long length = file.length(); + String filePath = File.separator + scene + File.separator + fileName; +// savePath = savePath + File.separator + dir + File.separator + fileName; + if (isFileExit(savePath + File.separator + scene)) { + if (file.renameTo(new File(filePath))) { + log.info("移动文件{}到{}目录",file.getName(), savePath + filePath); + } else { + log.info("文件{}移动失败",file.getName()); + return null; + } + } + return null; + }*/ - return new String(Base64.encodeBase64(data)); + /** + * 读取txt文件内容 + * @param file + * @return + */ + public static String txt2String(File file){ + StringBuilder result = new StringBuilder(); + try{ + //构造一个BufferedReader类来读取文件 + BufferedReader br = new BufferedReader(new FileReader(file)); + String s = null; + //使用readLine方法,一次读一行 + while((s = br.readLine())!=null){ + result.append(System.lineSeparator()).append(s); + } + br.close(); + }catch(Exception e){ + e.printStackTrace(); + } + return result.toString(); + } + + /** + * 确定上传文件路径遥感数据 栅格 + * @param file 文件 + * @return + */ + public static String fileRsSaveType(File file) { + String name = file.getName(); + String suffix = name.substring(name.indexOf(".")); + // 判断是否为栅格数据 + if (!suffix.contains("tif")) { + return null; + } + // GF1_PMS1_E116.8_N36.6_20190528_L1A0004026837-MSS1_ORTHO_MS.tif + String[] s = name.split("_"); + // 卫星种类 + String satelliteType = s[0]; + // 传感器种类 + String sensorType = s[1]; + // 中心点经度 + String lat = s[2]; + // 中心点纬度 + String lon = s[3]; + // 时间 + String time = s[4]; + String year = time.substring(0, 4); + String month = time.substring(4, 6); + String day = time.substring(6); + // 产品号 + String product = s[5]; + String productLevel = product.substring(0, 3); + String productCode = product.substring(3); + // 种类 + String type = s[6]; + // 文件路径 + String filePath = "/" + satelliteType + "/" + sensorType + "/" + productLevel + "/" + year + "/" + month + "/" + + day + "/" + productCode + "/"; + + return filePath; + } + + /** + * 矢量数据路径 + * C:\Users\dong\Desktop\2018年山东省矢量数据\2018年山东省矢量数据\2018年动态\分县动态\山东.gdb\sa.gdb + * @param file + * @return + */ + public static String fileShpSavePath(File file) { + if (file.exists()) { + if (file.isFile()) { + String path = file.getPath(); + String[] dirNames = path.split("\\\\"); + StringBuffer sb = new StringBuffer(); + int length = dirNames.length; + final int minLength = 5; + if (length >= minLength) { + for (int i = 5; i > 1; i--) { + sb.append("/").append(dirNames[length - i]); + } + return sb.toString(); + } + } + } + return null; + } + + public static Map getUploadInfo(String info) { + final String statusFail = "fail"; + final String status = "status"; + ObjectMapper mapper = new ObjectMapper(); + JsonNode resultNode = null; + Map map = new HashMap<>(); + try { + resultNode = mapper.readTree(info); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + if (!statusFail.equals(resultNode.path(status).asText())) { + String path = resultNode.path("path").asText(); + String fileName = path.substring(path.lastIndexOf("/") + 1); + map.put("md5", resultNode.path("md5").asText()); + map.put("mtime", getNowTimeStr()); + map.put("path", path); + map.put("scene", resultNode.path("scene").asText()); + map.put("size", resultNode.path("size").asText()); + map.put("url", resultNode.path("url").asText()); + map.put("fileName", fileName); + } + return map; + } + + public static boolean checkFileSize(Long len, int size, String unit) { +// long len = file.length(); + double fileSize = 0; + if ("B".equals(unit.toUpperCase())) { + fileSize = (double) len; + } else if ("K".equals(unit.toUpperCase())) { + fileSize = (double) len / 1024; + } else if ("M".equals(unit.toUpperCase())) { + fileSize = (double) len / 1048576; + } else if ("G".equals(unit.toUpperCase())) { + fileSize = (double) len / 1073741824; + } + if (fileSize > size) { + return false; + } + return true; } public static void main(String[] args) { - String oldPath = "C:/Users/xkrs/Desktop/WF/分布/maize"; - String newPath = "E:/img"; - try { - BufferedImage bufferegImage=ImageIO.read(new File(oldPath)); - //可以是png等其它图片格式 - ImageIO.write(bufferegImage,"jpg",new File(newPath)); - - }catch(IOException e) { - e.printStackTrace(); - } + String s = "C:/Users/dong/Desktop/2018年山东省矢量数据/2018年山东省矢量数据/2018年动态/分县动态/山东.gdb/a0000000a.gdbindexes"; + fileShpSavePath(new File(s)); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 67f3fd5..385b415 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -56,9 +56,9 @@ spring.messages.encoding = UTF-8 # 上传文件配置 spring.servlet.multipart.enabled=true # 最大文件大小 -spring.servlet.multipart.max-file-size = 64MB +spring.servlet.multipart.max-file-size = 100MB # 最大请求大小 -spring.servlet.multipart.max-request-size = 70MB +spring.servlet.multipart.max-request-size = 100MB spring.main.allow-bean-definition-overriding = true @@ -69,6 +69,9 @@ my.GeoserverAdress = http://139.199.98.175:9080/geoserver/ my.FileServerAdress = http://139.199.98.175:4096/ my.FileServerAdminAdress = http://127.0.0.1:4096/ +dfs.ip = 192.168.2.9 +dfs.port = 4096 + ## 自定义用户最大登录错误尝试次数 my.MaxLoginErrorCount = 5