Browse Source

增加FTP只允许上传图片和PDF

wukai 2 years ago
parent
commit
2f3b54dcad

+ 57 - 0
doc-biz/src/main/java/com/doc/ftp/DocFtpLet.java

@@ -0,0 +1,57 @@
+package com.doc.ftp;
+
+import com.doc.common.constant.Constants;
+import org.apache.ftpserver.ftplet.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+/**
+ * 自定义事件
+ *
+ * @author wukai
+ */
+public class DocFtpLet extends DefaultFtplet {
+
+    public static final Logger log = LoggerFactory.getLogger(DocFtpLet.class);
+
+    /**
+     * 开始上传
+     * Override this method to intercept uploads
+     *
+     * @param session The current {@link FtpSession}
+     * @param request The current {@link FtpRequest}
+     * @return The action for the container to take
+     * @throws FtpException
+     * @throws IOException
+     */
+    @Override
+    public FtpletResult onUploadStart(FtpSession session, FtpRequest request)
+            throws FtpException, IOException {
+        //获取上传文件的上传路径 
+        String path = session.getUser().getHomeDirectory();
+        try {
+            //自动创建上传路径
+            Files.createDirectories(Paths.get(path));
+        } catch (IOException ignored) {
+            //不用管,表示已经有该目录
+        }
+        //获取上传用户 
+        String name = session.getUser().getName();
+        //获取上传文件名 
+        String filename = request.getArgument();
+        String fileType = filename.substring(filename.lastIndexOf("."));
+        String allowType = Constants.IMAGE_EXTENSION + ".pdf";
+        //只允许图片和PDF
+        if (allowType.contains(fileType)) {
+            log.info("用户:'{}',上传文件到目录:'{}',文件名称为:'{}',状态:开始上传~", name, path, filename);
+            return super.onUploadStart(session, request);
+        } else {
+            log.error("上传非法文件{}", name);
+            throw new IOException();
+        }
+    }
+}

+ 6 - 3
doc-biz/src/main/java/com/doc/ftp/DocFtpServer.java

@@ -4,6 +4,7 @@ import org.apache.ftpserver.DataConnectionConfigurationFactory;
 import org.apache.ftpserver.FtpServer;
 import org.apache.ftpserver.FtpServerFactory;
 import org.apache.ftpserver.ftplet.FtpException;
+import org.apache.ftpserver.ftplet.Ftplet;
 import org.apache.ftpserver.listener.Listener;
 import org.apache.ftpserver.listener.ListenerFactory;
 import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;
@@ -17,6 +18,8 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.annotation.Resource;
 import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 注意:被@Configuration标记的类会被加入ioc容器中,而且类中所有带 @Bean注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。
@@ -75,9 +78,9 @@ public class DocFtpServer {
             Listener listener = listenerFactory.createListener();
             serverFactory.addListener("default", listener);
             //5、配置自定义用户事件
-//        Map<String, Ftplet> ftpLets = new HashMap();
-//        ftpLets.put("ftpService", new MyFtpPlet());
-//        serverFactory.setFtplets(ftpLets);
+            Map<String, Ftplet> ftpLets = new HashMap();
+            ftpLets.put("ftpService", new DocFtpLet());
+            serverFactory.setFtplets(ftpLets);
             //6、读取用户的配置信息
             //注意:配置文件位于resources目录下,如果项目使用内置容器打成jar包发布,FTPServer无法直接直接读取Jar包中的配置文件。
             //解决办法:将文件复制到指定目录(本文指定到根目录)下然后FTPServer才能读取到。

+ 1 - 1
doc-generator/src/main/resources/vm/vue/index.vue.vm

@@ -343,7 +343,7 @@
 </template>
 
 <script setup name="${BusinessName}">
-    import {get${BusinessName}, list${BusinessName}} from "@/api/";
+    import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
 
     const { proxy } = getCurrentInstance();
 #if(${dicts} != '')

+ 1 - 1
doc-generator/src/main/resources/vm/vue/v3/index.vue.vm

@@ -343,7 +343,7 @@
 </template>
 
 <script setup name="${BusinessName}">
-    import {get${BusinessName}, list${BusinessName}} from "@/api/";
+    import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
 
     const { proxy } = getCurrentInstance();
 #if(${dicts} != '')