diff --git a/pom.xml b/pom.xml
index 48b22f29..b7c46fc7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -44,11 +44,14 @@
         <mysql-connector-java.version>8.0.26</mysql-connector-java.version>
         <io-swagger.version>1.5.22</io-swagger.version>
         <lock4j.version>2.2.5</lock4j.version>
+        <minio.version>8.5.7</minio.version>
+        <okhttp.version>4.9.0</okhttp.version>
     </properties>
 
     <dependencyManagement>
         <dependencies>
 
+
             <dependency>
                 <groupId>mysql</groupId>
                 <artifactId>mysql-connector-java</artifactId>
@@ -121,6 +124,18 @@
                 <artifactId>swagger-annotations</artifactId>
                 <version>${io-swagger.version}</version>
             </dependency>
+
+            <dependency>
+                <groupId>io.minio</groupId>
+                <artifactId>minio</artifactId>
+                <version>${minio.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.squareup.okhttp3</groupId>
+                <artifactId>okhttp</artifactId>
+                <version>${okhttp.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
diff --git a/virtual-patient-common/pom.xml b/virtual-patient-common/pom.xml
index 4eb50d36..5011adfa 100644
--- a/virtual-patient-common/pom.xml
+++ b/virtual-patient-common/pom.xml
@@ -101,6 +101,16 @@
             <artifactId>hutool-all</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+        </dependency>
+
 
 
 
diff --git a/virtual-patient-common/src/main/java/com/supervision/config/JwtInterceptor.java b/virtual-patient-common/src/main/java/com/supervision/config/JwtInterceptor.java
index 70fe2534..89d7e453 100644
--- a/virtual-patient-common/src/main/java/com/supervision/config/JwtInterceptor.java
+++ b/virtual-patient-common/src/main/java/com/supervision/config/JwtInterceptor.java
@@ -37,21 +37,21 @@ public class JwtInterceptor implements HandlerInterceptor {
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
-        //请求消息头获取用户ID
-        String token = request.getHeader("token");
-        if (StrUtil.isBlank(token)) {
-            // 如果是swagger来的接口,说明这里是测试的,会伪造一个用户
-            if (StrUtil.isNotBlank(request.getHeader("Knife4j-Gateway-Code"))) {
-                cacheAuth(JWTUtil.parseToken(devActiveUser()));
-                return true;
-            } else {
-                throw new BusinessException("当前用户未登录", HttpStatus.UNAUTHORIZED.value());
-            }
-        }
-        JWT jwt = JWTUtil.parseToken(token);
-        // 校验token是否过期,如果过期了,需要提示过期重新登录
-        checkTokenExpire(jwt);
-        cacheAuth(jwt);
+//        //请求消息头获取用户ID
+//        String token = request.getHeader("token");
+//        if (StrUtil.isBlank(token)) {
+//            // 如果是swagger来的接口,说明这里是测试的,会伪造一个用户
+//            if (StrUtil.isNotBlank(request.getHeader("Knife4j-Gateway-Code"))) {
+//                cacheAuth(JWTUtil.parseToken(devActiveUser()));
+//                return true;
+//            } else {
+//                throw new BusinessException("当前用户未登录", HttpStatus.UNAUTHORIZED.value());
+//            }
+//        }
+//        JWT jwt = JWTUtil.parseToken(token);
+//        // 校验token是否过期,如果过期了,需要提示过期重新登录
+//        checkTokenExpire(jwt);
+//        cacheAuth(jwt);
         return true;
     }
 
diff --git a/virtual-patient-common/src/main/java/com/supervision/config/MinioConfig.java b/virtual-patient-common/src/main/java/com/supervision/config/MinioConfig.java
new file mode 100644
index 00000000..92329f17
--- /dev/null
+++ b/virtual-patient-common/src/main/java/com/supervision/config/MinioConfig.java
@@ -0,0 +1,24 @@
+package com.supervision.config;
+
+import io.minio.MinioClient;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MinioConfig {
+
+    /**
+     * 创建基于Java端的MinioClient
+     */
+    @Bean
+    @ConditionalOnProperty(prefix = "minio",name = "url")
+    public MinioClient minioClient(MinioProperties minioProperties) {
+        return MinioClient.builder().endpoint(minioProperties.getUrl())
+                .credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
+                .build();
+    }
+
+
+}
diff --git a/virtual-patient-common/src/main/java/com/supervision/config/MinioProperties.java b/virtual-patient-common/src/main/java/com/supervision/config/MinioProperties.java
new file mode 100644
index 00000000..d846f184
--- /dev/null
+++ b/virtual-patient-common/src/main/java/com/supervision/config/MinioProperties.java
@@ -0,0 +1,19 @@
+package com.supervision.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "minio")
+public class MinioProperties {
+
+    private String url;
+
+    private String accessKey;
+
+    private String secretKey;
+
+    private String bucketName;
+}
diff --git a/virtual-patient-common/src/main/java/com/supervision/util/MinioUtil.java b/virtual-patient-common/src/main/java/com/supervision/util/MinioUtil.java
new file mode 100644
index 00000000..69566704
--- /dev/null
+++ b/virtual-patient-common/src/main/java/com/supervision/util/MinioUtil.java
@@ -0,0 +1,85 @@
+package com.supervision.util;
+
+import com.supervision.config.MinioProperties;
+import io.minio.*;
+import io.minio.http.Method;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.InputStream;
+
+@Slf4j
+public class MinioUtil {
+    private static final MinioClient minioClient = SpringBeanUtil.getBean(MinioClient.class);
+
+    private static final String bucketName = SpringBeanUtil.getBean(MinioProperties.class).getBucketName();
+
+    static {
+        try {
+            if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
+
+                log.info("未找到bucket,自动建立");
+                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 上传一个文件
+     */
+    public static String uploadFile(InputStream stream, String objectName) throws Exception {
+        ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName)
+                .stream(stream, -1, 10485760).build());
+        return objectWriteResponse.object();
+    }
+
+    /**
+     * 下载一个文件
+     */
+    public static InputStream download(String fileId) throws Exception {
+        return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileId).build());
+    }
+
+
+
+    /**
+     * 删除一个对象
+     */
+    public static void deleteObject(String fileId) throws Exception {
+        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileId).build());
+    }
+
+
+
+
+    /**
+     * 获取文件信息
+     *
+     * @Param: [bucket, objectName]
+     * @return: java.lang.String
+     * @Author: MrFugui
+     * @Date: 2021/11/15
+     */
+    public static String getObjectInfo(String fileId) throws Exception {
+        return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileId).build()).toString();
+    }
+
+    /**
+     * 生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。
+     *
+     * @Param: [bucketName, objectName, expires]
+     * @return: java.lang.String
+     * @Author: MrFugui
+     * @Date: 2021/11/15
+     */
+    public static String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception {
+        GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs
+                .builder().bucket(bucketName).object(objectName).expiry(expires).method(Method.GET).build();
+        return minioClient.getPresignedObjectUrl(build);
+    }
+
+
+
+}
diff --git a/virtual-patient-web/src/main/java/com/supervision/VirtualPatientApplication.java b/virtual-patient-web/src/main/java/com/supervision/VirtualPatientApplication.java
index adf816c6..58cf6d1d 100644
--- a/virtual-patient-web/src/main/java/com/supervision/VirtualPatientApplication.java
+++ b/virtual-patient-web/src/main/java/com/supervision/VirtualPatientApplication.java
@@ -3,6 +3,7 @@ package com.supervision;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.ComponentScans;
 import org.springframework.scheduling.annotation.EnableScheduling;
diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java b/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java
index a7b3e38a..02bb9969 100644
--- a/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java
+++ b/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java
@@ -7,9 +7,14 @@ import cn.hutool.json.JSONUtil;
 import com.supervision.exception.BusinessException;
 import com.supervision.model.ConfigPhysicalTool;
 import com.supervision.service.ConfigPhysicalToolService;
+import com.supervision.util.MinioUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 
 @RestController
@@ -86,6 +91,16 @@ public class TestController {
         return signServer;
     }
 
+    @PostMapping("testFileUpload")
+    public String testFileUpload(MultipartFile file) throws Exception {
+        return MinioUtil.uploadFile(file.getInputStream(), UUID.randomUUID().toString());
+    }
+
+    @PostMapping("downloadFile")
+    public InputStream downloadFile(String fileId) throws Exception {
+        return MinioUtil.download(fileId);
+    }
+
 
 
 }
diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java b/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java
index 4de37f6c..894bc394 100644
--- a/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java
+++ b/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java
@@ -133,18 +133,10 @@ public class UserController {
     @ApiOperation("获取本机IP地址,用来给websocket使用")
     @GetMapping("queryWebSocketUrl")
     public String queryWebSocketUrl() {
-        // 如果是本地开发环境,则获取本机IP地址
-        if ("local".equals(active)) {
-            String template = "ws://{}:{}/virtual-patient/";
-            String localhostStr = NetUtil.getLocalhostStr();
-            return StrUtil.format(template, localhostStr, port);
-        } else {
-            String template = "wss://{}:{}/virtual-patient-websocket/";
-            if (StrUtil.isNotBlank(wsIp) && StrUtil.isNotBlank(wsPort)) {
-                return StrUtil.format(template, wsIp, wsPort);
-            }
+        String template = "wss://{}:{}/virtual-patient-websocket/";
+        if (StrUtil.isNotBlank(wsIp) && StrUtil.isNotBlank(wsPort)) {
+            return StrUtil.format(template, wsIp, wsPort);
         }
-
         throw new BusinessException("未获取到ws的nginx地址,请确认配置文件是否配置");
     }
 
diff --git a/virtual-patient-web/src/main/resources/application-dev.yml b/virtual-patient-web/src/main/resources/application-dev.yml
index 1e13247e..e83815c3 100644
--- a/virtual-patient-web/src/main/resources/application-dev.yml
+++ b/virtual-patient-web/src/main/resources/application-dev.yml
@@ -51,6 +51,12 @@ spring:
     port: 6379
     password: 123456
 
+minio:
+  url: http://192.168.10.138:9002
+  accessKey: admin
+  secretKey: 12345678
+  bucketName: virtual-patient-bucket-dev
+
 
 mybatis-plus:
   mapper-locations: classpath*:mapper/**/*.xml
diff --git a/virtual-patient-web/src/main/resources/application-local.yml b/virtual-patient-web/src/main/resources/application-local.yml
index 665bfbae..31dca534 100644
--- a/virtual-patient-web/src/main/resources/application-local.yml
+++ b/virtual-patient-web/src/main/resources/application-local.yml
@@ -51,6 +51,11 @@ spring:
     port: 6379
     password: 123456
 
+minio:
+  url: http://192.168.10.138:9002
+  accessKey: admin
+  secretKey: 12345678
+  bucketName: virtual-patient-bucket-dev
 
 mybatis-plus:
   mapper-locations: classpath*:mapper/**/*.xml
@@ -72,4 +77,10 @@ human:
   room-id: /getRoomId
   text-driven: /text_driven
   talk-status: /talkStatus
-  resourceMaxNumber: 5
\ No newline at end of file
+  resourceMaxNumber: 5
+
+# local环境使用dev的
+ws:
+  # nginx的wss地址(如果是wss的,那么带不带s都可以访问)
+  nginx-ip: 192.168.10.138
+  nginx-port: 443
\ No newline at end of file