<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>DurkBlue博客</title><link>https://www.hepuhua.cn/</link><description>DurkBlue博客提供个人/企业网站建设_如何搭建个人网站_微信公众号及其小程序__商城APP平台__优秀的博客主题展示_搭建独立博客网站以及SEO排名优化的原创科技博客（hepuhua.cn）</description><item><title>springBoot实现Redis分布式加锁功能</title><link>https://www.hepuhua.cn/post/997.html</link><description>&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;在Spring Boot中实现Redis分布式锁，你可以使用&lt;/span&gt;&lt;code style=&quot;background: none 0% 0% / auto repeat scroll padding-box border-box rgb(237, 238, 240); border-radius: 6px; margin: 0px 4px; padding: 1px 4px; -webkit-font-smoothing: antialiased; color: rgb(51, 51, 51); font-size: 16px; text-wrap-mode: wrap;&quot;&gt;Redisson&lt;/code&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;客户端，它提供了一个高级的Redis客户端，支持分布式锁的实现。以下是如何使用Redisson在Spring Boot应用中实现Redis分布式锁的步骤&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;在mavan中添加依赖&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre&gt;org.redissonredisson3.16.6&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;margin-top: 6px; margin-right: 0px; margin-bottom: 6px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; list-style: none; line-height: 30px; font-size: 18px; -webkit-font-smoothing: antialiased; font-weight: 500; -webkit-text-stroke-color: rgb(51, 51, 51); font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; color: rgb(51, 51, 51); text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;2. 配置RedissonClient&lt;/h3&gt;&lt;p class=&quot;marklang-paragraph&quot; style=&quot;margin-top: 6px; margin-bottom: 6px; padding: 0px; list-style: none; -webkit-font-smoothing: antialiased; font-size: 16px; line-height: 28px; color: rgb(51, 51, 51); -webkit-text-stroke-color: initial; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在Spring Boot的&lt;code style=&quot;background: none 0% 0% / auto repeat scroll padding-box border-box rgb(237, 238, 240); border-radius: 6px; margin: 0px 4px; padding: 1px 4px; -webkit-font-smoothing: antialiased;&quot;&gt;application.yml&lt;/code&gt;或&lt;code style=&quot;background: none 0% 0% / auto repeat scroll padding-box border-box rgb(237, 238, 240); border-radius: 6px; margin: 0px 4px; padding: 1px 4px; -webkit-font-smoothing: antialiased;&quot;&gt;application.properties&lt;/code&gt;中配置Redis连接信息&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;spring:
&amp;nbsp;&amp;nbsp;redis:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;host:&amp;nbsp;localhost
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;port:&amp;nbsp;6379
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password:&amp;nbsp;yourpassword&amp;nbsp;&amp;nbsp;#&amp;nbsp;如果你的Redis设置了密码&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;然后，创建一个配置类来配置RedissonClient：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;com.tehn.configorg.redisson.Redissonorg.redisson.api.RedissonClientorg.redisson.config.Configorg.springframework.beans.factory.annotation.org.springframework.context.annotation.org.springframework.context.annotation.RedissonConfig&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Integer&amp;nbsp;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;(destroyMethod=)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RedissonClient&amp;nbsp;()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Config&amp;nbsp;config&amp;nbsp;=&amp;nbsp;Config()config.useSingleServer()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.setAddress(+&amp;nbsp;+&amp;nbsp;+&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.setPassword()Redisson.(config)}
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;margin-top: 6px; margin-right: 0px; margin-bottom: 6px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; list-style: none; line-height: 30px; font-size: 18px; -webkit-font-smoothing: antialiased; font-weight: 500; -webkit-text-stroke-color: rgb(51, 51, 51); font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; color: rgb(51, 51, 51); text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;3. 使用RedissonClient实现分布式锁&lt;/h3&gt;&lt;p class=&quot;marklang-paragraph&quot; style=&quot;margin-top: 6px; margin-bottom: 6px; padding: 0px; list-style: none; -webkit-font-smoothing: antialiased; font-size: 16px; line-height: 28px; color: rgb(51, 51, 51); -webkit-text-stroke-color: initial; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在你的服务类中，注入&lt;code style=&quot;background: none 0% 0% / auto repeat scroll padding-box border-box rgb(237, 238, 240); border-radius: 6px; margin: 0px 4px; padding: 1px 4px; -webkit-font-smoothing: antialiased;&quot;&gt;RedissonClient&lt;/code&gt;并使用它来获取锁：&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;import&amp;nbsp;org.redisson.api.RLock;
import&amp;nbsp;org.redisson.api.RedissonClient;
import&amp;nbsp;org.springframework.beans.factory.annotation.Autowired;
import&amp;nbsp;org.springframework.stereotype.Service;
import&amp;nbsp;java.util.concurrent.TimeUnit;
@Service
public&amp;nbsp;class&amp;nbsp;DistributedLockService&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Autowired
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;RedissonClient&amp;nbsp;redissonClient;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;final&amp;nbsp;String&amp;nbsp;LOCK_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;myLock&amp;quot;;&amp;nbsp;//&amp;nbsp;锁的key，可根据需要修改
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;final&amp;nbsp;int&amp;nbsp;LOCK_EXPIRE&amp;nbsp;=&amp;nbsp;10;&amp;nbsp;//&amp;nbsp;锁过期时间，单位秒，可根据需要修改
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;final&amp;nbsp;int&amp;nbsp;LOCK_WAIT_TIME&amp;nbsp;=&amp;nbsp;5;&amp;nbsp;//&amp;nbsp;尝试获取锁的最大等待时间，单位秒，可根据需要修改
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;final&amp;nbsp;TimeUnit&amp;nbsp;TIME_UNIT&amp;nbsp;=&amp;nbsp;TimeUnit.SECONDS;&amp;nbsp;//&amp;nbsp;时间单位，可根据需要修改（秒）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;performTask()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RLock&amp;nbsp;lock&amp;nbsp;=&amp;nbsp;redissonClient.getLock(LOCK_KEY);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean&amp;nbsp;hasLock&amp;nbsp;=&amp;nbsp;false;&amp;nbsp;//&amp;nbsp;标记是否成功获取到锁，用于异常处理时释放锁
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hasLock&amp;nbsp;=&amp;nbsp;lock.tryLock(LOCK_WAIT_TIME,&amp;nbsp;LOCK_EXPIRE,&amp;nbsp;TIME_UNIT);&amp;nbsp;//&amp;nbsp;尝试获取锁，如果获取失败则等待一段时间再尝试获取，直到获取或超时。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(hasLock)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;执行业务逻辑...
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;Task&amp;nbsp;performed&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;Could&amp;nbsp;not&amp;nbsp;acquire&amp;nbsp;lock,&amp;nbsp;task&amp;nbsp;not&amp;nbsp;performed&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(InterruptedException&amp;nbsp;e)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.currentThread().interrupt();&amp;nbsp;//&amp;nbsp;重置中断状态，以便其他线程可以捕获到中断信号。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;finally&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(hasLock)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;如果成功获取到锁，则在finally块中释放锁。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock.unlock();&amp;nbsp;//&amp;nbsp;释放锁。注意：只有在成功获取到锁的情况下才释放锁。如果tryLock失败，则无需释放锁。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;如果在try块中没有成功获取到锁（即hasLock为false），则在finally块中不需要释放锁。因为根本没有获取到锁。但是，为了避免潜在的死锁问题，可以在此处添加日志记录或其他调试信息。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;例如：System.out.println(&amp;quot;Skipped&amp;nbsp;unlocking&amp;nbsp;as&amp;nbsp;lock&amp;nbsp;was&amp;nbsp;not&amp;nbsp;acquired&amp;quot;);。这样做可以帮助开发者在调试时更容易地识别问题所在。但在实际应用中，通常不需要这样做，
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//因为只有在成功获取到锁的情况下才需要释放锁。这里的注释主要是为了解释为什么在某些情况下不需要释放锁。实际上，在正常情况下，只有在成功获取到锁的情况下才会进入finally块并执行unlock操作。如果tryLock失败，则不会执行
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 08 Apr 2026 12:11:29 +0800</pubDate></item><item><title>nginx 将访问/fljc/public/下的所有除了css和js文件和图片资源之外 路由自动重写/fljc/public/index.php/下所有响应路径</title><link>https://www.hepuhua.cn/post/996.html</link><description>&lt;p&gt;要实现当访问 Nginx 服务器上的&amp;nbsp;&lt;code&gt;/fljc/public/&lt;/code&gt;&amp;nbsp;目录时，自动重写路由（即除了 CSS、JS 文件和图片资源之外的重定向），你可以使用 Nginx 的&amp;nbsp;&lt;code&gt;try_files&lt;/code&gt;&amp;nbsp;指令和&amp;nbsp;&lt;code&gt;location&lt;/code&gt;&amp;nbsp;块来配置。这种方法可以确保除了特定类型的文件外，其他请求都会被重定向到一个特定的处理程序或URL。&lt;/p&gt;&lt;p&gt;以下是一个配置示例，假设你想要将所有非CSS、JS和图片的请求重定向到你的应用的主入口文件（例如&amp;nbsp;&lt;code&gt;index.php&lt;/code&gt;）：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;server&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;80;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server_name&amp;nbsp;yourdomain.com;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root&amp;nbsp;/path/to/fljc/public;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;index&amp;nbsp;index.php&amp;nbsp;index.html&amp;nbsp;index.htm;
&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;是这两个开始
location&amp;nbsp;/fljc/public/&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rewrite&amp;nbsp;^/fljc/public/(.*)$&amp;nbsp;/fljc/public/index.php/$1&amp;nbsp;last;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
location&amp;nbsp;~&amp;nbsp;\.(jpg|jpeg|png|gif|ico|css|js)$&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try_files&amp;nbsp;$uri&amp;nbsp;=404;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;expires&amp;nbsp;30d;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;#&amp;nbsp;是这两个结束
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;~&amp;nbsp;\.php$&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;include&amp;nbsp;fastcgi_params;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fastcgi_pass&amp;nbsp;unix:/var/run/php/php7.4-fpm.sock;&amp;nbsp;#&amp;nbsp;根据你的PHP版本和配置调整
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fastcgi_index&amp;nbsp;index.php;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fastcgi_param&amp;nbsp;SCRIPT_FILENAME&amp;nbsp;$document_root$fastcgi_script_name;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;margin-top: 6px; margin-right: 0px; margin-bottom: 6px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; list-style: none; line-height: 30px; font-size: 18px; -webkit-font-smoothing: antialiased; font-weight: 500; -webkit-text-stroke-color: rgb(51, 51, 51); font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; color: rgb(51, 51, 51); text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;解释：&lt;/h3&gt;&lt;ol style=&quot;list-style-type: none;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;‌根目录配置‌：&lt;code&gt;root /path/to/fljc/public;&lt;/code&gt;&amp;nbsp;指定了 Nginx 的根目录。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;‌主位置块‌ (&lt;code&gt;location /fljc/public&lt;/code&gt;)：&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;rewrite ^/fljc/public/(.*)$ /fljc/public/index.php/$1 last;&lt;/code&gt;&amp;nbsp;将所有非静态文件的请求重写到&amp;nbsp;&lt;code&gt;index.php&lt;/code&gt;，并通过&amp;nbsp;&lt;code&gt;$1&lt;/code&gt;&amp;nbsp;捕获原始URI。&lt;code&gt;last&lt;/code&gt;&amp;nbsp;指令告诉 Nginx 使用新的 URI 重新执行请求。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p&gt;‌静态文件处理‌：&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;location ~ \.(jpg|jpeg|png|gif|ico|css|js)$&lt;/code&gt;&amp;nbsp;匹配图片、CSS 和 JS 文件，并设置它们过期时间为30天。如果文件不存在，返回404。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p&gt;‌PHP 处理‌：&lt;/p&gt;&lt;/li&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;location ~ \.php$&lt;/code&gt;&amp;nbsp;用于处理 PHP 文件，通过&amp;nbsp;&lt;code&gt;fastcgi_pass&lt;/code&gt;&amp;nbsp;指令将请求传递给 FastCGI 服务器（如 PHP-FPM）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;p&gt;通过这种方式，所有对&amp;nbsp;&lt;code&gt;/fljc/public/&lt;/code&gt;&amp;nbsp;的请求（除了 CSS、JS 和图片文件）都会被重定向到&amp;nbsp;&lt;code&gt;index.php&lt;/code&gt;，从而实现你的需求。确保根据你的实际目录结构和 PHP-FPM 配置调整路径和参数。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 25 Mar 2026 16:56:16 +0800</pubDate></item><item><title>浅谈以下如何实现超大文件断点续传功能</title><link>https://www.hepuhua.cn/post/995.html</link><description>&lt;p&gt;断点续传 就是下载文件时，不必重头开始下载，而是从指定的位置继续下载，这样的功能就叫做断点续传。 &amp;nbsp;断点续传的理解可以分为两部分：一部分是断点，一部分是续传。断点的由来是在下载过程中，将一个下载文件分成了多个部分，同时进行多个部分一起的下载，当某个时间点，任务被暂停了，此时下载暂停的位置就是断点了。续传就是当一个未完成的下载任务再次开始时，会从上次的断点继续传送。&lt;/p&gt;&lt;p&gt;以前文件无法分割，但随着html5新特性的引入，类似普通字符串、数组的分割，我们可以可以使用slice方法来分割文件。所以断点续传的最基本实现也就是：&lt;a href=&quot;https://cloud.tencent.com/developer/tools/blog-entry?target=https%3A%2F%2Fjavaforall.cn%2Ftag%2F%25e5%2589%258d%25e7%25ab%25af&amp;objectId=2096897&amp;objectType=1&amp;contentType=undefined&quot; qct-click=&quot;&quot; qct-exposure=&quot;&quot; qct-area=&quot;链接-前端&quot;&gt;前端&lt;/a&gt;通过FileList对象获取到相应的文件，按照指定的分割方式将大文件分段，然后一段一段地传给后端，后端再按顺序一段段将文件进行拼接。&lt;/p&gt;&lt;p&gt;而我们需要对FileList对象进行修改再提交，在之前的文章中知晓了这种提交的一些注意点，因为FileList对象不能直接更改，所以不能直接通过表单的.submit()方法上传提交，需要结合FormData对象生成一个新的数据，通过Ajax进行上传操作。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;设计思路&lt;/p&gt;&lt;p&gt;1. 分片上传（Chunk Upload）&lt;/p&gt;&lt;p&gt;核心思想：将一个大文件（比如1GB）切割成多个固定大小的小分片（比如10MB/片），分别上传，服务端接收所有分片后再合并成完整文件。&lt;/p&gt;&lt;p&gt;解决问题：避免单次上传大文件时网络中断导致全部重传、请求超时、服务器内存溢出等问题。&lt;/p&gt;&lt;p&gt;2. 断点 续传（Resumable Upload）&lt;/p&gt;&lt;p&gt;核心思想：上传前先校验文件的唯一标识（如MD5/文件大小+修改时间），服务端查询该文件已上传的分片，只上传未完成的分片。&lt;/p&gt;&lt;p&gt;关键依赖：需要一个“分片记录器”（数据库/缓存），记录每个文件的分片上传状态（已上传分片索引、总分片数、文件唯一标识等）。&lt;/p&gt;&lt;p&gt;3. 多文件上传&lt;/p&gt;&lt;p&gt;本质是对单文件上传逻辑的复用，前端传递文件列表，后端循环处理每个文件的分片/断点续传逻辑即可。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;整体实现流程&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;整个流程分为前端预处理和后端核心逻辑两部分，以下是标准化的实现步骤：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;步骤1：文件唯一标识生成（前端+后端）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;为了区分不同文件、校验分片归属，首先生成文件的唯一标识（推荐MD5）：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;前端：读取文件内容，计算文件的MD5（可使用SparkMD5等库），同时指定分片大小（如10MB），计算总分片数。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;后端：接收MD5后，可作为文件的唯一ID，用于查询分片上传状态。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;步骤2：断点续传校验（前端请求，后端响应）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;前端上传前先请求后端：“文件MD5为某某的文件，哪些分片已经上传完成”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;后端：查询分片记录（数据库/缓存），返回已上传的分片索引列表。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;前端：根据返回结果，只上传未完成的分片（实现断点续传）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;步骤3：分片上传（核心）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;前端将文件切割成分片，逐个/并发上传分片，每个分片携带：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;1.文件MD5（文件唯一标识）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;2.分片索引（第几个分片，从0开始）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;3.总分片数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;4.分片内容&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;后端接收分片后，保存到临时目录，并更新分片上传状态。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;步骤4：合并分片（所有分片上传完成后）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;前端确认所有分片上传完成后，请求后端合并分片：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;后端：按分片索引顺序读取所有临时分片文件，写入最终文件路径，删除临时分片，更新文件上传状态为“完成”。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;基于这个思路，以下博主分享代码&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;html部分&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta&amp;nbsp;charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
&amp;lt;meta&amp;nbsp;http-equiv=&amp;quot;X-UA-Compatible&amp;quot;&amp;nbsp;content=&amp;quot;IE=edge&amp;quot;&amp;gt;
&amp;lt;meta&amp;nbsp;name=&amp;quot;viewport&amp;quot;&amp;nbsp;content=&amp;quot;width=device-width,&amp;nbsp;initial-scale=1.0&amp;quot;&amp;gt;
&amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;script&amp;nbsp;src=&amp;quot;http://localhost/jquery-4.0.0.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!--&amp;nbsp;使用SparkMD5库来获取文件的MD5哈希值&amp;nbsp;--&amp;gt;
&amp;lt;script&amp;nbsp;src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/spark-md5/3.0.2/spark-md5.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;html5大文件断点切割上传&amp;lt;/h1&amp;gt;
&amp;lt;input&amp;nbsp;type=&amp;quot;file&amp;quot;&amp;nbsp;id=&amp;quot;fileInput&amp;quot;&amp;nbsp;/&amp;gt;
&amp;lt;button&amp;nbsp;onclick=&amp;quot;calculateMD5()&amp;quot;&amp;gt;上传文件&amp;lt;/button&amp;gt;
&amp;lt;div&amp;nbsp;id=&amp;quot;progress&amp;quot;&amp;gt;0%&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
function&amp;nbsp;calculateMD5()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;fileInput&amp;nbsp;=&amp;nbsp;document.getElementById(&amp;#39;fileInput&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;file&amp;nbsp;=&amp;nbsp;fileInput.files[0];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!file)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(&amp;#39;请选择一个文件&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;new&amp;nbsp;FileReader();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;spark&amp;nbsp;=&amp;nbsp;new&amp;nbsp;SparkMD5.ArrayBuffer();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;fileLoaded&amp;nbsp;=&amp;nbsp;false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader.onload&amp;nbsp;=&amp;nbsp;function(e)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;文件加载成功
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileLoaded&amp;nbsp;=&amp;nbsp;true;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spark.append(e.target.result);&amp;nbsp;//&amp;nbsp;读取文件完成之后放进内存缓冲区
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;hash&amp;nbsp;=&amp;nbsp;spark.end();&amp;nbsp;//&amp;nbsp;获取hash文件哈希值
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(hash,&amp;quot;曲中&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uploadFile(file,&amp;nbsp;hash);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader.onerror&amp;nbsp;=&amp;nbsp;function()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&amp;#39;Spark读取文件中出现意外错误&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader.readAsArrayBuffer(file);
&amp;nbsp;}
function&amp;nbsp;uploadFile(file,&amp;nbsp;fileMD5)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;CHUNK_SIZE&amp;nbsp;=&amp;nbsp;1024&amp;nbsp;*&amp;nbsp;1024&amp;nbsp;*&amp;nbsp;5;&amp;nbsp;//&amp;nbsp;5MB&amp;nbsp;每个分片大小
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;totalChunks&amp;nbsp;=&amp;nbsp;Math.ceil(file.size&amp;nbsp;/&amp;nbsp;CHUNK_SIZE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkFile(fileMD5,&amp;nbsp;totalChunks);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;offset&amp;nbsp;&amp;nbsp;在那个分片索引标识开始上传
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;fileMD5&amp;nbsp;&amp;nbsp;文件唯一标识
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;currentChunk&amp;nbsp;当前已经上传的分片数量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;uploadedBytes&amp;nbsp;当前已完成上传的文件大小
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;uploadChunk(fileMD5,&amp;nbsp;currentChunk)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;offset&amp;nbsp;=&amp;nbsp;currentChunk&amp;nbsp;*&amp;nbsp;CHUNK_SIZE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;uploadedBytes&amp;nbsp;=&amp;nbsp;offset;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;blob&amp;nbsp;=&amp;nbsp;file.slice(offset,&amp;nbsp;offset&amp;nbsp;+&amp;nbsp;CHUNK_SIZE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;formData&amp;nbsp;=&amp;nbsp;new&amp;nbsp;FormData();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;chunkFile&amp;#39;,&amp;nbsp;blob);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;chunkIndex&amp;#39;,&amp;nbsp;currentChunk);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;totalChunks&amp;#39;,&amp;nbsp;totalChunks);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;fileName&amp;#39;,&amp;nbsp;file.name);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;fileSize&amp;#39;,&amp;nbsp;file.size);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;chunkSize&amp;#39;,&amp;nbsp;CHUNK_SIZE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;fileMd5&amp;#39;,&amp;nbsp;fileMD5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.ajax({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;&amp;#39;http://localhost:60000/upload/chunk&amp;#39;,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;#39;POST&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data:&amp;nbsp;formData,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;processData:&amp;nbsp;false,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentType:&amp;nbsp;false,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr:&amp;nbsp;function()&amp;nbsp;{&amp;nbsp;//&amp;nbsp;Custom&amp;nbsp;XMLHttpRequest&amp;nbsp;to&amp;nbsp;handle&amp;nbsp;progress&amp;nbsp;updates
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;xhr&amp;nbsp;=&amp;nbsp;new&amp;nbsp;XMLHttpRequest();&amp;nbsp;//&amp;nbsp;XMLHttpRequest&amp;nbsp;object&amp;nbsp;to&amp;nbsp;monitor&amp;nbsp;progress&amp;nbsp;events
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xhr.upload.addEventListener(&amp;quot;progress&amp;quot;,&amp;nbsp;function(evt)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(evt.lengthComputable)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;percentComplete&amp;nbsp;=&amp;nbsp;Math.round((evt.loaded&amp;nbsp;/&amp;nbsp;evt.total)&amp;nbsp;*&amp;nbsp;100);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uploadedBytes&amp;nbsp;+=&amp;nbsp;evt.loaded;&amp;nbsp;//&amp;nbsp;Update&amp;nbsp;uploaded&amp;nbsp;bytes&amp;nbsp;counter
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&amp;#39;#progress&amp;#39;).text(percentComplete&amp;nbsp;+&amp;nbsp;&amp;#39;%&amp;#39;);&amp;nbsp;//&amp;nbsp;Update&amp;nbsp;progress&amp;nbsp;bar&amp;nbsp;or&amp;nbsp;text&amp;nbsp;display&amp;nbsp;on&amp;nbsp;client&amp;nbsp;side&amp;nbsp;if&amp;nbsp;needed
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;false);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;xhr;&amp;nbsp;//&amp;nbsp;Return&amp;nbsp;the&amp;nbsp;XHR&amp;nbsp;object&amp;nbsp;for&amp;nbsp;jQuery&amp;nbsp;to&amp;nbsp;use&amp;nbsp;it&amp;nbsp;for&amp;nbsp;the&amp;nbsp;request
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success:&amp;nbsp;function(data)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;On&amp;nbsp;successful&amp;nbsp;upload&amp;nbsp;of&amp;nbsp;this&amp;nbsp;chunk,&amp;nbsp;upload&amp;nbsp;the&amp;nbsp;next&amp;nbsp;one&amp;nbsp;(recursive&amp;nbsp;call)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(data.code&amp;nbsp;==&amp;nbsp;200)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentChunk++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(currentChunk&amp;nbsp;&amp;lt;&amp;nbsp;totalChunks)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uploadChunk(fileMD5,&amp;nbsp;currentChunk);&amp;nbsp;//&amp;nbsp;继续上传下一个分片
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;所有分片上传完毕，发起文件合并请求
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mergeFile(fileMD5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(data.msg);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;在执行上传该文件时,向后端提交检查该文件有没有中断上传的记录，如果有，则从上传失败的分片索引处开始继续上传
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;checkFile(fileMD5,&amp;nbsp;chunksTotalNum){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;formData&amp;nbsp;=&amp;nbsp;new&amp;nbsp;FormData();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;fileMd5&amp;#39;,&amp;nbsp;fileMD5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.ajax({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;&amp;#39;http://localhost:60000/upload/check&amp;#39;,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;#39;POST&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data:&amp;nbsp;formData,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;processData:&amp;nbsp;false,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentType:&amp;nbsp;false,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success:&amp;nbsp;function(data)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(data.code&amp;nbsp;==&amp;nbsp;200)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;arr&amp;nbsp;=&amp;nbsp;data.data;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(arr.finishChunk.length&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;uploadChunk(fileMD5,&amp;nbsp;0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if(chunksTotalNum&amp;nbsp;&amp;lt;=&amp;nbsp;arr.finishChunk.length){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(arr.isMerge&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;mergeFile(fileMD5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;return&amp;nbsp;alert(&amp;#39;文件早已上传&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;继续上传未尽的分片
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uploadChunk(fileMD5,&amp;nbsp;arr.finishChunk[arr.finishChunk.length&amp;nbsp;-&amp;nbsp;1]);&amp;nbsp;//&amp;nbsp;继续上传下一个分片
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(data.msg);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;在分片上传全部完成后，向后端提交合并请求
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;mergeFile(fileMD5){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;formData&amp;nbsp;=&amp;nbsp;new&amp;nbsp;FormData();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formData.append(&amp;#39;fileMd5&amp;#39;,&amp;nbsp;fileMD5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.ajax({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;&amp;#39;http://localhost:60000/upload/merge&amp;#39;,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;#39;POST&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data:&amp;nbsp;formData,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;processData:&amp;nbsp;false,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentType:&amp;nbsp;false,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success:&amp;nbsp;function(data)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;On&amp;nbsp;successful&amp;nbsp;upload&amp;nbsp;of&amp;nbsp;this&amp;nbsp;chunk,&amp;nbsp;upload&amp;nbsp;the&amp;nbsp;next&amp;nbsp;one&amp;nbsp;(recursive&amp;nbsp;call)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(data.code&amp;nbsp;==&amp;nbsp;200)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(&amp;#39;文件上传完成&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(&amp;#39;文件上传失败&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;后端部分(采用了springBoot+Mysql)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;数据表&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-sql&quot;&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;`file_upload_record`&amp;nbsp;(
&amp;nbsp;&amp;nbsp;`id`&amp;nbsp;bigint(20)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;AUTO_INCREMENT&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;主键&amp;#39;,
&amp;nbsp;&amp;nbsp;`file_md5`&amp;nbsp;varchar(64)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;文件唯一标识（MD5）&amp;#39;,
&amp;nbsp;&amp;nbsp;`file_name`&amp;nbsp;varchar(255)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;文件名&amp;#39;,
&amp;nbsp;&amp;nbsp;`file_size`&amp;nbsp;bigint(20)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;文件总大小（字节）&amp;#39;,
&amp;nbsp;&amp;nbsp;`chunk_size`&amp;nbsp;bigint(20)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;分片大小（字节）&amp;#39;,
&amp;nbsp;&amp;nbsp;`total_chunks`&amp;nbsp;int(11)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;总分片数&amp;#39;,
&amp;nbsp;&amp;nbsp;`uploaded_chunks`&amp;nbsp;varchar(1000)&amp;nbsp;DEFAULT&amp;nbsp;&amp;#39;&amp;#39;&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;已上传分片索引（逗号分隔，如0,1,2）&amp;#39;,
&amp;nbsp;&amp;nbsp;`file_path`&amp;nbsp;varchar(500)&amp;nbsp;DEFAULT&amp;nbsp;NULL&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;最终文件保存路径&amp;#39;,
&amp;nbsp;&amp;nbsp;`status`&amp;nbsp;tinyint(4)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;&amp;#39;0&amp;#39;&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;0-未完成&amp;nbsp;1-已完成&amp;#39;,
&amp;nbsp;&amp;nbsp;`create_time`&amp;nbsp;datetime&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP,
&amp;nbsp;&amp;nbsp;`update_time`&amp;nbsp;datetime&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP&amp;nbsp;ON&amp;nbsp;UPDATE&amp;nbsp;CURRENT_TIMESTAMP,
&amp;nbsp;&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;(`id`),
&amp;nbsp;&amp;nbsp;UNIQUE&amp;nbsp;KEY&amp;nbsp;`uk_file_md5`&amp;nbsp;(`file_md5`)
)&amp;nbsp;ENGINE=InnoDB&amp;nbsp;AUTO_INCREMENT=2&amp;nbsp;DEFAULT&amp;nbsp;CHARSET=utf8mb4&amp;nbsp;COMMENT=&amp;#39;文件上传记录表&amp;#39;;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;// maven依赖&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;exclusions&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;exclusion&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;spring-boot-starter-logging&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/exclusion&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;/exclusions&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;exclusions&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;exclusion&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;spring-boot-starter-logging&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/exclusion&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;/exclusions&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;!-- mysql&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;驱动包 &lt;/span&gt;--&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;com.mysql&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;mysql-connector-j&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;lt;!-- mybatis&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;的相关依赖 &lt;/span&gt;--&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;version&amp;gt;2.3.1&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;lt;!-- &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;日志输出依赖包 &lt;/span&gt;--&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;version&amp;gt;1.7.21&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;version&amp;gt;1.7.21&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;commons-collections4&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;version&amp;gt;4.4&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;!-- myBatis-plus --&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;version&amp;gt;3.5.3.1&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;lt;!-- &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;文件操作工具 &lt;/span&gt;--&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;commons-io&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;version&amp;gt;2.15.0&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&amp;lt;!-- &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;校验&lt;/span&gt;MD5 --&amp;gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;groupId&amp;gt;commons-codec&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;artifactId&amp;gt;commons-codec&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;lt;version&amp;gt;1.15&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;// 实体类&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;package com.durkblue.domain;&lt;br/&gt;&lt;br/&gt;import com.baomidou.mybatisplus.annotation.IdType;&lt;br/&gt;import com.baomidou.mybatisplus.annotation.TableField;&lt;br/&gt;import com.baomidou.mybatisplus.annotation.TableId;&lt;br/&gt;import com.baomidou.mybatisplus.annotation.TableName;&lt;br/&gt;&lt;br/&gt;import java.util.Date;&lt;br/&gt;&lt;br/&gt;@TableName(&amp;quot;file_upload_record&amp;quot;)&lt;br/&gt;public class FileUploadRecord {&lt;br/&gt; &amp;nbsp; &amp;nbsp;@TableId(type = IdType.&lt;span style=&quot;font-style: italic;&quot;&gt;AUTO&lt;/span&gt;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private Long id;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;文件&lt;/span&gt;MD5&lt;br/&gt; &amp;nbsp; &amp;nbsp;@TableField(&amp;quot;file_md5&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private String fileMd5;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;文件名&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@TableField(&amp;quot;file_name&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private String fileName;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;文件总大小（字节）&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@TableField(&amp;quot;file_size&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private Long fileSize;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;分片大小（字节）&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@TableField(&amp;quot;chunk_size&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private Long chunkSize;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;总分片数&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@TableField(&amp;quot;total_chunks&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private Integer totalChunks;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;已上传分片索引（逗号分隔）&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@TableField(&amp;quot;uploaded_chunks&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private String uploadedChunks;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;最终文件路径&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@TableField(&amp;quot;file_path&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private String filePath;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;上传状态：&lt;/span&gt;0-&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;未完成&lt;/span&gt; 1-&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;已完成&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@TableField(&amp;quot;status&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private Integer status;&lt;br/&gt; &amp;nbsp; &amp;nbsp;@TableField(&amp;quot;create_time&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;记录时间&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;private Date createTime;&lt;br/&gt; &amp;nbsp; &amp;nbsp;@TableField(&amp;quot;update_time&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;上传时间&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;private Date updateTime;&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Long getId() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return id;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setId(Long id) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.id = id;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public String getFileMd5() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return fileMd5;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setFileMd5(String fileMd5) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.fileMd5 = fileMd5;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public String getFileName() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return fileName;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setFileName(String fileName) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.fileName = fileName;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Long getFileSize() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return fileSize;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setFileSize(Long fileSize) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.fileSize = fileSize;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Long getChunkSize() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return chunkSize;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setChunkSize(Long chunkSize) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.chunkSize = chunkSize;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Integer getTotalChunks() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return totalChunks;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setTotalChunks(Integer totalChunks) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.totalChunks = totalChunks;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public String getUploadedChunks() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return uploadedChunks;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setUploadedChunks(String uploadedChunks) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.uploadedChunks = uploadedChunks;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public String getFilePath() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return filePath;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setFilePath(String filePath) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.filePath = filePath;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Integer getStatus() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return status;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setStatus(Integer status) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.status = status;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Date getCreateTime() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return createTime;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setCreateTime(Date createTime) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.createTime = createTime;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Date getUpdateTime() {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return updateTime;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void setUpdateTime(Date updateTime) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.updateTime = updateTime;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;}&lt;/span&gt;&lt;br/&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;// mapper层&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;package com.durkblue.mapper;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;import com.baomidou.mybatisplus.core.mapper.BaseMapper;&lt;br/&gt;import com.durkblue.domain.FileUploadRecord;&lt;br/&gt;import org.apache.ibatis.annotations.Mapper;&lt;br/&gt;&lt;br/&gt;@Mapper&lt;br/&gt;public interface FileUploadRecordMapper extends BaseMapper&amp;lt;FileUploadRecord&amp;gt; {&lt;br/&gt;}&lt;/span&gt;&lt;br/&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;// service层接口&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;package com.durkblue.service;&lt;br/&gt;&lt;br/&gt;import org.springframework.web.multipart.MultipartFile;&lt;br/&gt;&lt;br/&gt;import java.io.IOException;&lt;br/&gt;import java.util.Map;&lt;br/&gt;import java.util.Set;&lt;br/&gt;&lt;br/&gt;public interface IFileUploadService {&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;断点续传校验，返回已上传的分片索引&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;*&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;fileMd5 &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;文件分片标识&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@return &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;分片索引&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;Map&amp;lt;String, Object&amp;gt; checkUploadedChunks(String fileMd5);&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;上传总文件当中单个分片&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;fileMd5 &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;总文件唯一标识&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;fileName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;总文件名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;fileSize &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;总文件大小&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;chunkSize &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;分片文件大小&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;chunkIndex &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;分片索引&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;totalChunks &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;总分片数&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;chunkFile &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;分片文件&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@return &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;是否上传该分片成功&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@throws &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;IOException &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;异常&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;boolean uploadChunk(String fileMd5, String fileName, Long fileSize, Long chunkSize,&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer chunkIndex, Integer totalChunks, MultipartFile chunkFile) throws IOException;&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;合并所有文件分片&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;fileMd5 &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;总文件唯一标识&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@return &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;是否合并成功&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;@throws &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;IOException &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;异常&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;boolean mergeChunks(String fileMd5) throws IOException;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;// service层实现类&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;package com.durkblue.service.impl;&lt;br/&gt;&lt;br/&gt;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;&lt;br/&gt;import com.durkblue.domain.FileUploadRecord;&lt;br/&gt;import com.durkblue.mapper.FileUploadRecordMapper;&lt;br/&gt;import com.durkblue.service.IFileUploadService;&lt;br/&gt;import org.apache.commons.collections4.MapUtils;&lt;br/&gt;import org.apache.commons.io.FileUtils;&lt;br/&gt;import org.apache.ibatis.util.MapUtil;&lt;br/&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br/&gt;import org.springframework.stereotype.Service;&lt;br/&gt;import org.springframework.web.multipart.MultipartFile;&lt;br/&gt;&lt;br/&gt;import java.io.BufferedOutputStream;&lt;br/&gt;import java.io.File;&lt;br/&gt;import java.io.FileOutputStream;&lt;br/&gt;import java.io.IOException;&lt;br/&gt;import java.util.*;&lt;br/&gt;import java.util.stream.Collectors;&lt;br/&gt;&lt;br/&gt;@Service&lt;br/&gt;public class FileUploadServiceImpl implements IFileUploadService {&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;当分片上传全部完成后最终文件存储目录&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;private final String finalPath = &amp;quot;D:\\file\\upload\\&amp;quot;;&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;临时文件分片存储目录&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;private String tempPath = &amp;quot;D:\\file\\tmp\\&amp;quot;;&lt;br/&gt; &amp;nbsp; &amp;nbsp;@Autowired&lt;br/&gt; &amp;nbsp; &amp;nbsp;private FileUploadRecordMapper fileUploadRecordMapper;&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;@Override&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Map&amp;lt;String, Object&amp;gt; checkUploadedChunks(String fileMd5) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Map&amp;lt;String, Object&amp;gt; dataMap = new HashMap&amp;lt;&amp;gt;();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LambdaQueryWrapper&amp;lt;FileUploadRecord&amp;gt; queryWrapper = new LambdaQueryWrapper&amp;lt;&amp;gt;();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queryWrapper.eq(FileUploadRecord::getFileMd5, fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FileUploadRecord record = fileUploadRecordMapper.selectOne(queryWrapper);&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;无记录：返回空集合（所有分片都未上传）&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;if (Objects.&lt;span style=&quot;font-style: italic;&quot;&gt;isNull&lt;/span&gt;(record)) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dataMap.put(&amp;quot;finishChunk&amp;quot;, new HashSet&amp;lt;&amp;gt;());// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;当前已经上传的分片索引&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;dataMap.put(&amp;quot;isMerge&amp;quot;, 0);// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;当前文件是否需要文件合并操作&lt;/span&gt;0=&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;否&lt;/span&gt;1=&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;是&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;}else{&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;已完成：返回所有分片索引（前端无需再上传）&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;if (record.getStatus() == 1) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Set&amp;lt;Integer&amp;gt; allChunks = new HashSet&amp;lt;&amp;gt;();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; record.getTotalChunks(); i++) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;allChunks.add(i);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dataMap.put(&amp;quot;finishChunk&amp;quot;, allChunks);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dataMap.put(&amp;quot;isMerge&amp;quot;, record.getStatus());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else{&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;未完成：解析已上传分片索引&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;String uploadedChunks = record.getUploadedChunks();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (uploadedChunks == null || uploadedChunks.isEmpty()) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dataMap.put(&amp;quot;finishChunk&amp;quot;, new HashSet&amp;lt;&amp;gt;());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dataMap.put(&amp;quot;isMerge&amp;quot;, record.getStatus());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}else{&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Set&amp;lt;Integer&amp;gt; chunkSet = Arrays.&lt;span style=&quot;font-style: italic;&quot;&gt;stream&lt;/span&gt;(uploadedChunks.split(&amp;quot;&lt;span style=&quot;background-color: #364135;&quot;&gt;,&lt;/span&gt;&amp;quot;))&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.map(Integer::&lt;span style=&quot;font-style: italic;&quot;&gt;parseInt&lt;/span&gt;)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.collect(Collectors.&lt;span style=&quot;font-style: italic;&quot;&gt;toSet&lt;/span&gt;());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dataMap.put(&amp;quot;finishChunk&amp;quot;, chunkSet);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dataMap.put(&amp;quot;isMerge&amp;quot;, record.getStatus());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return dataMap;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;@Override&lt;br/&gt; &amp;nbsp; &amp;nbsp;public boolean uploadChunk(String fileMd5, String fileName, Long fileSize, Long chunkSize, Integer chunkIndex, Integer totalChunks, MultipartFile chunkFile) throws IOException {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 1. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;校验分片文件&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;if (chunkFile.isEmpty()) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;分片文件为空&lt;/span&gt;&amp;quot;);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 2. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;创建临时目录（按文件&lt;/span&gt;MD5&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;分目录，避免分片冲突）&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;File tempDir = new File(tempPath + File.&lt;span style=&quot;font-style: italic;&quot;&gt;separator &lt;/span&gt;+ fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!tempDir.exists()) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FileUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;forceMkdir&lt;/span&gt;(tempDir);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 3. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;保存分片文件（命名规则：&lt;/span&gt;fileMd5 + &amp;quot;_&amp;quot; + chunkIndex&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;）&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;File chunkFileObj = new File(tempDir, fileMd5 + &amp;quot;_&amp;quot; + chunkIndex);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FileUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;copyInputStreamToFile&lt;/span&gt;(chunkFile.getInputStream(), chunkFileObj);&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 4. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;更新分片上传记录&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;LambdaQueryWrapper&amp;lt;FileUploadRecord&amp;gt; queryWrapper = new LambdaQueryWrapper&amp;lt;&amp;gt;();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queryWrapper.eq(FileUploadRecord::getFileMd5, fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FileUploadRecord record = fileUploadRecordMapper.selectOne(queryWrapper);&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Objects.&lt;span style=&quot;font-style: italic;&quot;&gt;isNull&lt;/span&gt;(record)) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;首次上传：新增记录&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;record = new FileUploadRecord();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setFileMd5(fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setFileName(fileName);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setFileSize(fileSize);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setChunkSize(chunkSize);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setTotalChunks(totalChunks);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setUploadedChunks(chunkIndex.toString());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setStatus(0);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fileUploadRecordMapper.insert(record);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;非首次上传：追加分片索引&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;Map&amp;lt;String, Object&amp;gt; uploadMap = checkUploadedChunks(fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Set&amp;lt;Integer&amp;gt; uploadedSet = (Set&amp;lt;Integer&amp;gt;) MapUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;getObject&lt;/span&gt;(uploadMap, &amp;quot;finishChunk&amp;quot;);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;uploadedSet.add(chunkIndex);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String newUploadedChunks = uploadedSet.stream()&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.sorted()&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.map(String::&lt;span style=&quot;font-style: italic;&quot;&gt;valueOf&lt;/span&gt;)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.collect(Collectors.&lt;span style=&quot;font-style: italic;&quot;&gt;joining&lt;/span&gt;(&amp;quot;,&amp;quot;));&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setUploadedChunks(newUploadedChunks);&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fileUploadRecordMapper.updateById(record);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;判断是否最后一个分片上传&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;if(uploadedSet.size() == record.getTotalChunks()){&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;最后一个分片上传，执行文件合并&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;mergeChunks(fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;@Override&lt;br/&gt; &amp;nbsp; &amp;nbsp;public boolean mergeChunks(String fileMd5) throws IOException {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 1. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;查询文件记录&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;LambdaQueryWrapper&amp;lt;FileUploadRecord&amp;gt; queryWrapper = new LambdaQueryWrapper&amp;lt;&amp;gt;();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queryWrapper.eq(FileUploadRecord::getFileMd5, fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FileUploadRecord record = fileUploadRecordMapper.selectOne(queryWrapper);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (record == null || record.getStatus() == 1) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true; // &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;无记录或已合并，直接返回成功&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 2. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;校验所有分片是否上传完成&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;Map&amp;lt;String, Object&amp;gt; uploadMap = checkUploadedChunks(fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Set&amp;lt;Integer&amp;gt; uploadedChunks = (Set&amp;lt;Integer&amp;gt;) MapUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;getObject&lt;/span&gt;(uploadMap, &amp;quot;finishChunk&amp;quot;);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (uploadedChunks.size() != record.getTotalChunks()) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;分片未全部上传，无法合并&lt;/span&gt;&amp;quot;);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 3. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;创建最终文件目录&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;File finalDir = new File(finalPath);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!finalDir.exists()) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FileUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;forceMkdir&lt;/span&gt;(finalDir);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 4. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;合并分片到最终文件&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;File finalFile = new File(finalDir, record.getFileName());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try (FileOutputStream fos = new FileOutputStream(finalFile, true);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BufferedOutputStream bos = new BufferedOutputStream(fos)) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;按分片索引顺序读取并写入&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;for (int i = 0; i &amp;lt; record.getTotalChunks(); i++) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;File chunkFile = new File(tempPath + File.&lt;span style=&quot;font-style: italic;&quot;&gt;separator &lt;/span&gt;+ fileMd5, fileMd5 + &amp;quot;_&amp;quot; + i);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!chunkFile.exists()) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;分片&lt;/span&gt;&amp;quot; + i + &amp;quot;&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;不存在&lt;/span&gt;&amp;quot;);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;写入分片内容&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;FileUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;copyFile&lt;/span&gt;(chunkFile, bos);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;删除临时分片文件&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;FileUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;delete&lt;/span&gt;(chunkFile);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 5. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;更新记录：标记为已完成，保存最终文件路径&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;record.setFilePath(finalFile.getAbsolutePath());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;record.setStatus(1);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fileUploadRecordMapper.updateById(record);&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 6. &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;删除临时目录&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;File tempDir = new File(tempPath + File.&lt;span style=&quot;font-style: italic;&quot;&gt;separator &lt;/span&gt;+ fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FileUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;deleteDirectory&lt;/span&gt;(tempDir);&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;}&lt;/span&gt;&lt;br/&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;&amp;nbsp;// 工具类&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre&gt;com.durkblue.utiljava.util.HashMapjava.util.ObjectsAjaxResult&amp;nbsp;HashMap&amp;lt;StringObject&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;String&amp;nbsp;=&amp;nbsp;String&amp;nbsp;=&amp;nbsp;String&amp;nbsp;=&amp;nbsp;String&amp;nbsp;=&amp;nbsp;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(codeString&amp;nbsp;msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.put(code).put(msg)}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(Object&amp;nbsp;dataInteger&amp;nbsp;total){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.put(data).put(total).put().put()}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(codeString&amp;nbsp;msgObject&amp;nbsp;data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.put(code).put(msg)(!Objects.(data))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.put(data)}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult&amp;nbsp;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult.()}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult&amp;nbsp;(Object&amp;nbsp;data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult.(data)}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult&amp;nbsp;(String&amp;nbsp;msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult.(msg)}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult&amp;nbsp;(String&amp;nbsp;msgObject&amp;nbsp;data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult(msgdata)}



&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult&amp;nbsp;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult.()}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult&amp;nbsp;(String&amp;nbsp;msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult.(msg)}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult&amp;nbsp;(String&amp;nbsp;msgObject&amp;nbsp;data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult(msgdata)}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult&amp;nbsp;(codeString&amp;nbsp;msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AjaxResult(codemsg)}



}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;// controller层&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;package com.durkblue.controller;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;import com.durkblue.service.IFileUploadService;&lt;br/&gt;import com.durkblue.util.AjaxResult;&lt;br/&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br/&gt;import org.springframework.web.bind.annotation.GetMapping;&lt;br/&gt;import org.springframework.web.bind.annotation.PostMapping;&lt;br/&gt;import org.springframework.web.bind.annotation.RequestMapping;&lt;br/&gt;import org.springframework.web.bind.annotation.RestController;&lt;br/&gt;import org.springframework.web.multipart.MultipartFile;&lt;br/&gt;&lt;br/&gt;import java.io.IOException;&lt;br/&gt;import java.util.Map;&lt;br/&gt;import java.util.Set;&lt;br/&gt;&lt;br/&gt;@RestController&lt;br/&gt;@RequestMapping(&amp;quot;/upload&amp;quot;)&lt;br/&gt;public class FileUploadController {&lt;br/&gt; &amp;nbsp; &amp;nbsp;@Autowired&lt;br/&gt; &amp;nbsp; &amp;nbsp;private IFileUploadService fileUploadService;&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;断点续传校验接口&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@PostMapping(&amp;quot;/check&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;public AjaxResult checkUpload(String fileMd5) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Map&amp;lt;String, Object&amp;gt; uploadedChunks = fileUploadService.checkUploadedChunks(fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return AjaxResult.&lt;span style=&quot;font-style: italic;&quot;&gt;success&lt;/span&gt;(uploadedChunks);&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;分片上传接口（单文件分片）&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@PostMapping(&amp;quot;/chunk&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;public AjaxResult uploadChunk(String fileMd5, String fileName, Long fileSize, Long chunkSize, Integer chunkIndex,&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer totalChunks, MultipartFile chunkFile) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fileUploadService.uploadChunk(fileMd5, fileName, fileSize,&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;chunkSize, chunkIndex, totalChunks, chunkFile);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return AjaxResult.&lt;span style=&quot;font-style: italic;&quot;&gt;success&lt;/span&gt;(&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;分片上传成功&lt;/span&gt;&amp;quot;);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (IOException e) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return AjaxResult.&lt;span style=&quot;font-style: italic;&quot;&gt;error&lt;/span&gt;(&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;分片上传失败：&lt;/span&gt;&amp;quot; + e.getMessage());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace;&quot;&gt;分片合并接口&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@PostMapping(&amp;quot;/merge&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;public AjaxResult mergeChunks(String fileMd5) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fileUploadService.mergeChunks(fileMd5);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return AjaxResult.&lt;span style=&quot;font-style: italic;&quot;&gt;success&lt;/span&gt;(&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;文件合并成功&lt;/span&gt;&amp;quot;);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (IOException e) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return AjaxResult.&lt;span style=&quot;font-style: italic;&quot;&gt;error&lt;/span&gt;(&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;文件合并失败：&lt;/span&gt;&amp;quot; + e.getMessage());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt;}&lt;/span&gt;&lt;br/&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;// 解决跨域问题&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;package com.durkblue.config;&lt;br/&gt;&lt;br/&gt;import org.springframework.context.annotation.Configuration;&lt;br/&gt;import org.springframework.web.servlet.config.annotation.CorsRegistry;&lt;br/&gt;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;&lt;br/&gt;@Configuration&lt;br/&gt;public class WebConfig implements WebMvcConfigurer {&lt;br/&gt; &amp;nbsp; &amp;nbsp;@Override&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void addCorsMappings(CorsRegistry registry) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;registry.addMapping(&amp;quot;/upload/**&amp;quot;) // &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;调整为你的映射路径&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;.allowedOrigins(&amp;quot;http://localhost&amp;quot;) // &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;替换为你的前端应用的&lt;/span&gt; URL&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.allowedMethods(&amp;quot;POST&amp;quot;, &amp;quot;GET&amp;quot;, &amp;quot;PUT&amp;quot;, &amp;quot;DELETE&amp;quot;) // &lt;span style=&quot;font-family: 宋体, monospace;&quot;&gt;根据需要添加更多方法&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;.allowCredentials(true)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.maxAge(3600);&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt;}&lt;/span&gt;&lt;br/&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;// springboot配置文件&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-markdown&quot;&gt;:
&amp;nbsp;&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;file-resume-from-breakpoint
&amp;nbsp;&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;jdbc:mysql://localhost:3306/ruoyi-wvp?useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;serverTimezone=Asia/Shanghai
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;....:&amp;nbsp;root
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;root
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;:&amp;nbsp;:&amp;nbsp;:&amp;nbsp;:&amp;nbsp;:&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;50MB
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;100MB
:
&amp;nbsp;&amp;nbsp;:&amp;nbsp;classpath:/mapping/*Mapper.xml
&amp;nbsp;&amp;nbsp;:&amp;nbsp;com.durkblue.domain
&amp;nbsp;&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;:
&amp;nbsp;&amp;nbsp;:&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2026/03/202603211774104088958909.png&quot; alt=&quot;image.png&quot; width=&quot;1155&quot; height=&quot;786&quot; style=&quot;width: 1155px; height: 786px;&quot;/&gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 21 Mar 2026 22:20:52 +0800</pubDate></item><item><title>ZLMediaKit在linux  X86_64上的部署与启动</title><link>https://www.hepuhua.cn/post/994.html</link><description>&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;步骤1：安装yasm&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz&lt;/p&gt;&lt;p&gt;tar -zxvf yasm-1.3.0.tar.gz&lt;/p&gt;&lt;p&gt;cd yasm-1.3.0&lt;/p&gt;&lt;p&gt;./configure&lt;/p&gt;&lt;p&gt;make &amp;amp;&amp;amp; make install&lt;/p&gt;&lt;p&gt;#查看是否安装成功&lt;/p&gt;&lt;p&gt;yasm --version&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;步骤2：安装gcc&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 首先查看是否已经安装gcc,如果安装且版本&amp;gt;=4.8跳过此步骤&lt;/p&gt;&lt;p&gt;gcc -v&lt;/p&gt;&lt;p&gt;# 安装gcc&amp;nbsp;&lt;/p&gt;&lt;p&gt;yum isntall gcc&lt;/p&gt;&lt;p&gt;yum -y install gcc-c++&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&amp;nbsp;步骤3：安装ffmpeg&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz&lt;/p&gt;&lt;p&gt;tar -zxvf ffmpeg-3.1.tar.gz&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;cd ffmpeg-3.1&lt;/p&gt;&lt;p&gt;./configure --prefix=/usr/local/ffmpeg&lt;/p&gt;&lt;p&gt;make &amp;amp;&amp;amp; make install&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;vim /etc/profile&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#在最后PATH添加环境变量：&lt;/p&gt;&lt;p&gt;export PATH=$PATH:/usr/local/ffmpeg/bin&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#更新环境&lt;/p&gt;&lt;p&gt;source /etc/profile&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#查看ffmpeg版本&lt;/p&gt;&lt;p&gt;ffmpeg -version&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;步骤4：安装cmake&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;#获取CMake源码包&lt;/p&gt;&lt;p&gt;wget https://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5.tar.gz&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#解压CMake源码包&lt;/p&gt;&lt;p&gt;tar -zxvf cmake-3.20.5.tar.gz&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#编译安装&lt;/p&gt;&lt;p&gt;cd cmake-3.20.5&lt;/p&gt;&lt;p&gt;./bootstrap &amp;amp;&amp;amp; make -j4 &amp;amp;&amp;amp; make install&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#配置环境变量&lt;/p&gt;&lt;p&gt;vim /etc/profile&lt;/p&gt;&lt;p&gt;#文件末尾加上配置&amp;nbsp;&lt;/p&gt;&lt;p&gt;export CMAKE_HOME=/opt/cmake/cmake-3.20.5/bin&lt;/p&gt;&lt;p&gt;export PATH=$CMAKE_HOME:$PATH&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#刷新配置&lt;/p&gt;&lt;p&gt;source /etc/profile&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;cmake --version&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;步骤5：安装openssl&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 服务器安装好后一版自带openssl，但是自带的openssl可能版本和zlmediakit所需的版本不匹配，此处推荐安装openssl 1.1.1K&lt;/p&gt;&lt;p&gt;#查看openssl版本&lt;/p&gt;&lt;p&gt;openssl version -a&lt;/p&gt;&lt;p&gt;#安装openssl&lt;/p&gt;&lt;p&gt;wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz&lt;/p&gt;&lt;p&gt;tar -xvzf openssl-1.1.1k.tar.gz&lt;/p&gt;&lt;p&gt;yum install -y zlib zlib-devel perl-CPAN&lt;/p&gt;&lt;p&gt;cd openssl-1.1.1k&lt;/p&gt;&lt;p&gt;./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl&lt;/p&gt;&lt;p&gt;make &amp;amp;&amp;amp; make install&lt;/p&gt;&lt;p&gt;echo &amp;quot;/usr/local/lib64/&amp;quot; &amp;gt;&amp;gt; /etc/ld.so.conf&lt;/p&gt;&lt;p&gt;echo &amp;quot;/usr/local/openssl/lib&amp;quot; &amp;gt;&amp;gt; /etc/ld.so.conf&lt;/p&gt;&lt;p&gt;ldconfig&lt;/p&gt;&lt;p&gt;ln -s /usr/local/openssl/bin/openssl&amp;nbsp; /usr/local/bin/openssl # 替换系统openssl，非必须&lt;/p&gt;&lt;p&gt;openssl version -a&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&amp;nbsp;步骤6：安装libsrtp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;wget https://codeload.github.com/cisco/libsrtp/tar.gz/refs/tags/v2.3.0&lt;/p&gt;&lt;p&gt;tar -xvzf libsrtp-2.3.0.tar.gz&lt;/p&gt;&lt;p&gt;cd libsrtp-2.3.0&lt;/p&gt;&lt;p&gt;./configure --enable-openssl --with-openssl-dir=/usr/local/openssl&lt;/p&gt;&lt;p&gt;make -j8 &amp;amp;&amp;amp; make install&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;步骤7：下载zlm源码&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#如果没安装git 那么安装&lt;/p&gt;&lt;p&gt;yum install -y git&lt;/p&gt;&lt;p&gt;#国内用户推荐从同步镜像网站gitee下载&amp;nbsp;&lt;/p&gt;&lt;p&gt;git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit&lt;/p&gt;&lt;p&gt;cd ZLMediaKit&lt;/p&gt;&lt;p&gt;#千万不要忘记执行这句命令&lt;/p&gt;&lt;p&gt;git submodule update --init&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#编译&lt;/p&gt;&lt;p&gt;mkdir build&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;cd build&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;cmake .. -DENABLE_WEBRTC=true&amp;nbsp; -DOPENSSL_ROOT_DIR=/usr/local/openssl&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-DOPENSSL_LIBRARIES=/usr/local/openssl/lib&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;cmake --build . --target MediaServer&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;# 最终输出&lt;/p&gt;&lt;p&gt;[ 96%] Built target test_rtcp_fci&lt;/p&gt;&lt;p&gt;[ 96%] Building CXX object tests/CMakeFiles/test_rtp.dir/test_rtp.cpp.o&lt;/p&gt;&lt;p&gt;[ 97%] Linking CXX executable ../../release/linux/Debug/test_rtp&lt;/p&gt;&lt;p&gt;[ 97%] Built target test_rtp&lt;/p&gt;&lt;p&gt;[ 97%] Building CXX object tests/CMakeFiles/test_wsServer.dir/test_wsServer.cpp.o&lt;/p&gt;&lt;p&gt;[ 97%] Linking CXX executable ../../release/linux/Debug/test_wsServer&lt;/p&gt;&lt;p&gt;[ 97%] Built target test_wsServer&lt;/p&gt;&lt;p&gt;[ 97%] Building CXX object tests/CMakeFiles/test_server.dir/test_server.cpp.o&lt;/p&gt;&lt;p&gt;[ 97%] Linking CXX executable ../../release/linux/Debug/test_server&lt;/p&gt;&lt;p&gt;[ 97%] Built target test_server&lt;/p&gt;&lt;p&gt;[ 98%] Built target jsoncpp&lt;/p&gt;&lt;p&gt;[ 98%] Linking CXX executable ../../release/linux/Debug/MediaServer&lt;/p&gt;&lt;p&gt;[100%] Built target MediaServer&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 0px; padding: 0px; font-size: 16px; color: rgb(79, 79, 79); overflow: auto hidden; line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap-mode: wrap;&quot;&gt;步骤8:配置文件&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 0px; padding: 0px; font-size: 16px; color: rgb(79, 79, 79); overflow: auto hidden; line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap-mode: wrap;&quot;&gt;配置http端口和https端口,并接触ip限制白名单&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2026/03/202603091773038899690572.png&quot; alt=&quot;image.png&quot; width=&quot;1257&quot; height=&quot;621&quot; style=&quot;width: 1257px; height: 621px;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;步骤8：运行&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;MediaServer -c&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, Arial, sans-serif; font-size: medium; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;/data/durkblue/ZLMediaKit/conf/config.ini&amp;nbsp; &amp;nbsp;#&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, Arial, sans-serif; font-size: medium; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;/data/durkblue/ZLMediaKit/conf/config.ini为MediaServer配置文件目录&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, Arial, sans-serif; font-size: medium; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, Arial, sans-serif; font-size: medium; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, Arial, sans-serif; font-size: medium; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, Arial, sans-serif; font-size: medium; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;步骤9：查看是否启动成功&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, Arial, sans-serif; font-size: medium; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, Arial, sans-serif; font-size: medium; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4f4f4f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #EEF0F4;&quot;&gt;&lt;b&gt;ps -ef | grep MediaServer&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4f4f4f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #EEF0F4;&quot;&gt;&lt;b&gt;&lt;br/&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4f4f4f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #EEF0F4;&quot;&gt;&lt;b&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;常用命令&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4f4f4f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #EEF0F4;&quot;&gt;&lt;b&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4f4f4f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #EEF0F4;&quot;&gt;&lt;b&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;#热加载配置文件&lt;/p&gt;&lt;p&gt;killall -1 MediaServer&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#关闭MediaServer&lt;/p&gt;&lt;p&gt;killall -2 MediaServer&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4f4f4f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #EEF0F4;&quot;&gt;&lt;b&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4f4f4f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #EEF0F4;&quot;&gt;&lt;b&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;访问链接&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;#ip:ZLMediaKit配置文件中http的port端口&lt;/p&gt;&lt;p&gt;http://ip:端口/webrtc/&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4f4f4f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #EEF0F4;&quot;&gt;&lt;b&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4F4F4F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #EEF0F4;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 09 Mar 2026 14:41:21 +0800</pubDate></item><item><title>记录离线方式实现docker版本的升级 docker-compose升级版本</title><link>https://www.hepuhua.cn/post/993.html</link><description>&lt;p&gt;&lt;strong&gt;一、docker版本的升级&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;在 AArch64 架构（如使用 ARM64 处理器，如 Raspberry Pi 4 或其他基于 ARM 的服务器）上离线升级 Docker 版本到 25.0 可能需要一些额外的步骤，因为通常 Docker 官方仓库不提供离线安装包。同样适用于cpu芯片架构为X86_64(只需要下载docker的X86平台安装包)&lt;/p&gt;&lt;p&gt;步骤 1: 确认当前 Docker 版本&lt;/p&gt;&lt;p&gt;首先，确认你的系统上当前安装的 Docker 版本。可以通过运行以下命令来查看：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;--version&lt;/pre&gt;&lt;p&gt;步骤 2: 下载 Docker 安装包&lt;/p&gt;&lt;p&gt;由于你需要在离线环境中操作，你需要手动下载 Docker 的安装包。你可以从 Docker 的官方网站或其他可信来源下载适用于 AArch64 的 Docker 版本。例如，访问 &lt;a href=&quot;https://download.docker.com/linux/static/stable/aarch64/&quot; target=&quot;_blank&quot;&gt;Docker 官方下载页面&lt;/a&gt; 并找到适合你的 Docker 版本（在这个例子中是 25.0）。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2026/02/202602101770698947310077.png&quot; alt=&quot;image.png&quot; width=&quot;1418&quot; height=&quot;851&quot; style=&quot;width: 1418px; height: 851px;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;步骤 3: 传输安装包到目标设备&lt;/p&gt;&lt;p&gt;将下载的 Docker 安装包传输到你的 AArch64 设备上。你可以使用 scp, rsync, 或者任何其他文件传输工具来完成这个任务&lt;/p&gt;&lt;p&gt;步骤 4: 解压并替换二进制文件&lt;/p&gt;&lt;p&gt;4.1登录到服务器。&lt;/p&gt;&lt;p&gt;4.2解压下载的安装包：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;tar&amp;nbsp;-xvf&amp;nbsp;docker-25.0.0.tgz&lt;/pre&gt;&lt;p&gt;4.3&amp;nbsp;将解压后的二进制文件移动到 /usr/bin 或者 Docker 推荐的目录中（例如 /usr/local/bin）：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;sudo&amp;nbsp;mv&amp;nbsp;docker/*&amp;nbsp;/usr/bin/&amp;nbsp;&amp;nbsp;#&amp;nbsp;将当前终端命令下的路径下的docker文件夹下的所有文件包括文件夹移动到/usr/bin目录下&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2026/02/202602101770699352797913.png&quot; alt=&quot;image.png&quot; width=&quot;1405&quot; height=&quot;697&quot; style=&quot;width: 1405px; height: 697px;&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;步骤 5: 更新 Docker 服务配置（可选）&lt;/p&gt;&lt;p&gt;如果需要更新 Docker 的配置文件（如 daemon.json），确保这些配置文件位于 /etc/docker 目录下，并根据需要更新它们。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;步骤 6: 重启 Docker 服务&lt;/p&gt;&lt;p&gt;重新启动 Docker 服务以确保新版本的 Docker 正在运行：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;systemctl&amp;nbsp;restart&amp;nbsp;docker&lt;/pre&gt;&lt;p&gt;或者，如果你使用的是较旧的系统，可能需要使用：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;service&amp;nbsp;docker&amp;nbsp;restart&lt;/pre&gt;&lt;p&gt;步骤 7: 验证 Docker 版本&lt;/p&gt;&lt;p&gt;最后，验证 Docker 是否成功更新到新版本：&lt;/p&gt;&lt;p&gt;docker --version&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、docker-compose版本升级&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;要在基于 ARM64 架构（如 AArch64）的系统中离线升级&amp;nbsp;&lt;code&gt;docker-compose&lt;/code&gt;&amp;nbsp;版本到 2.26.1，你可以按照以下步骤操作。这个过程涉及到下载&amp;nbsp;&lt;code&gt;docker-compose&lt;/code&gt;&amp;nbsp;的二进制文件并手动安装，因为直接在线安装通常是通过 pip 安装，这在离线环境中不适用。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;首先，你需要从 Docker 的官方网站或者其他可信源下载&amp;nbsp;&lt;code&gt;docker-compose&lt;/code&gt;&amp;nbsp;的二进制文件。对于 AArch64 架构，你可以访问 Docker 的 GitHub Releases 页面或者直接从 Docker Hub 获取预编译的二进制文件。&lt;/p&gt;&lt;p&gt;1.访问&amp;nbsp;&lt;a href=&quot;https://github.com/docker/compose/releases?page=1&quot; target=&quot;_self&quot;&gt;Docker Compose GitHub Releases&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;2.找到版本 2.26.1 的发布页面。&lt;/p&gt;&lt;p&gt;3.下载适用于 Linux 的 ARM64 架构的二进制文件。通常文件名类似于&amp;nbsp;&lt;code&gt;docker-compose-linux-aarch64&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#333333;font-family:PingFang SC, Arial, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;margin-top: 18px; margin-right: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; scrollbar-width: thin; scrollbar-color: rgba(183, 185, 193, 0.6) transparent; -webkit-font-smoothing: antialiased; line-height: 30px; font-size: 18px; -webkit-text-stroke-color: initial; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; color: rgb(51, 51, 51); text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;步骤 2: 安装 docker-compose&lt;/h3&gt;&lt;p&gt;下载完成后，你需要将下载的二进制文件移动到系统的 PATH 中，以便可以从任何位置运行它。&lt;/p&gt;&lt;p&gt;1.使用&amp;nbsp;&lt;code&gt;scp&lt;/code&gt;&amp;nbsp;或其他文件传输工具将下载的二进制文件传输到你的 AArch64 系统。&lt;/p&gt;&lt;p&gt;2.使用 SSH 登录到你的系统。&lt;/p&gt;&lt;p&gt;3.将二进制文件移动到&amp;nbsp;&lt;code&gt;/usr/bin&lt;/code&gt;&amp;nbsp;或你喜欢的任何目录，并将其重命名为&amp;nbsp;&lt;code&gt;docker-compose&lt;/code&gt;（没有版本号）：&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#333333;font-family:PingFang SC, Arial, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span class=&quot;hljs-built_in&quot; style=&quot;margin: 0px; padding: 0px; scrollbar-width: thin; scrollbar-color: rgba(183, 185, 193, 0.6) transparent; -webkit-font-smoothing: antialiased; color: #D59F00; font-family: monospace; font-size: 16px; white-space-collapse: preserve; background-color: rgba(245, 246, 249, 0.5);&quot;&gt;mv&lt;/span&gt;&lt;span style=&quot;color: #333333; font-family: monospace; font-size: 16px; white-space-collapse: preserve; background-color: rgba(245, 246, 249, 0.5);&quot;&gt; docker-compose-linux-aarch64 /usr/local/bin/docker-compose&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#333333;font-family:PingFang SC, Arial, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;4.给docker-compose加执行命令权限&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#333333;font-family:PingFang SC, Arial, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span class=&quot;hljs-built_in&quot; style=&quot;margin: 0px; padding: 0px; scrollbar-width: thin; scrollbar-color: rgba(183, 185, 193, 0.6) transparent; -webkit-font-smoothing: antialiased; color: #D59F00; font-family: monospace; font-size: 16px; white-space-collapse: preserve; background-color: rgba(245, 246, 249, 0.5);&quot;&gt;chmod&lt;/span&gt;&lt;span style=&quot;color: #333333; font-family: monospace; font-size: 16px; white-space-collapse: preserve; background-color: rgba(245, 246, 249, 0.5);&quot;&gt; +x /usr/bin/docker-compose&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;5.确认&amp;nbsp;&lt;code&gt;docker-compose&lt;/code&gt;&amp;nbsp;是否正确安装：&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#333333;font-family:monospace&quot;&gt;&lt;span style=&quot;font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;docker-compose --version&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#333333;font-family:monospace&quot;&gt;&lt;span style=&quot;font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;如果有输出新的版本则表明成功&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#333333;font-family:monospace&quot;&gt;&lt;span style=&quot;font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description><pubDate>Tue, 10 Feb 2026 12:44:25 +0800</pubDate></item><item><title>在js里引用地图发现 is invoked via document.write. The network request for this script MAY be blocked by the </title><link>https://www.hepuhua.cn/post/992.html</link><description>&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 在页面中引用高德地图后发现页面出现黄色警告&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;api?v=2.0&amp;amp;ak=dm65KD93tW9zmcZys9YvKIUj:1&amp;nbsp;A&amp;nbsp;parser-blocking,&amp;nbsp;cross&amp;nbsp;site&amp;nbsp;(i.e.&amp;nbsp;different&amp;nbsp;eTLD+1)&amp;nbsp;script,&amp;nbsp;http://api.map.baidu.com/getscript?v=2.0&amp;amp;ak=YvKIUj&amp;amp;services=&amp;amp;t=20190123111209,&amp;nbsp;is&amp;nbsp;invoked&amp;nbsp;via&amp;nbsp;document.write.&amp;nbsp;The&amp;nbsp;network&amp;nbsp;request&amp;nbsp;for&amp;nbsp;this&amp;nbsp;script&amp;nbsp;MAY&amp;nbsp;be&amp;nbsp;blocked&amp;nbsp;by&amp;nbsp;the&amp;nbsp;browser&amp;nbsp;in&amp;nbsp;this&amp;nbsp;or&amp;nbsp;a&amp;nbsp;future&amp;nbsp;page&amp;nbsp;load&amp;nbsp;due&amp;nbsp;to&amp;nbsp;poor&amp;nbsp;network&amp;nbsp;connectivity.&amp;nbsp;If&amp;nbsp;blocked&amp;nbsp;in&amp;nbsp;this&amp;nbsp;page&amp;nbsp;load,&amp;nbsp;it&amp;nbsp;will&amp;nbsp;be&amp;nbsp;confirmed&amp;nbsp;in&amp;nbsp;a&amp;nbsp;subsequent&amp;nbsp;console&amp;nbsp;message.&amp;nbsp;See&amp;nbsp;https://www.chromestatus.com/feature/5718547946799104&amp;nbsp;for&amp;nbsp;more&amp;nbsp;details.&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;造成这个警告的原因是：&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.在弱的网络连接环境下，比如2G网络，在页面上使用document.write()来动态插入外部的脚本会阻塞页面的解析，延迟页面的显示，甚至加载脚本失败，最终导致页面不能正确显示。&lt;/p&gt;&lt;p&gt;2.为了提高用户的体验，Chrome对于由document.write()动态插入的&amp;lt;script&amp;gt;会做检查，当满足下面所有的条件下，Chrome不会执行加载。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;a.用户处在弱网络连接的环境下，特别是2G网络&lt;/p&gt;&lt;p&gt;b.document.write()在主页面里，对于那些嵌入在iframe里的页面没有影响。&lt;/p&gt;&lt;p&gt;c.在document.write()插入的脚本是阻碍解析的（parser-blocking）。如果插入的&amp;lt;script&amp;gt;标签加了async 或着defer属性，脚本会异步加载，不影响解析 ，所以也是能被执行的&lt;/p&gt;&lt;p&gt;d.加载的脚本和站点不是同一个域名&lt;/p&gt;&lt;p&gt;e.脚本没有在浏览器的缓存里&lt;/p&gt;&lt;p&gt;f.页面不是重新加载&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; outline: 0px; margin-bottom: 24px; padding: 0px; list-style-position: initial; list-style-image: initial; font-size: 16px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; color: rgba(0, 0, 0, 0.75); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;从&lt;code style=&quot;box-sizing: border-box; outline: 0px; font-family: &amp;quot;Source Code Pro&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Anonymous Pro&amp;quot;, &amp;quot;Droid Sans Mono&amp;quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 14px; line-height: 22px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 2px; padding: 2px 4px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;Chrome 53&lt;/code&gt;开始，对于满足&lt;code style=&quot;box-sizing: border-box; outline: 0px; font-family: &amp;quot;Source Code Pro&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Anonymous Pro&amp;quot;, &amp;quot;Droid Sans Mono&amp;quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 14px; line-height: 22px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 2px; padding: 2px 4px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;2-5&lt;/code&gt;条件的代码，在控制台会输出上述警告.&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;解决途径&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;改变地图js的引用方法&lt;/p&gt;&lt;p&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://api.map.baidu.com/api?v=2.0&amp;amp;ak=your ak&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;&lt;p&gt;改成&lt;/p&gt;&lt;p&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://api.map.baidu.com/getscript?v=2.0&amp;amp;ak=your ak&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 09 Feb 2026 09:52:49 +0800</pubDate></item><item><title>记录phpStudy环境软件数据库管理器phpMyAdmin4.8.5 更改为远程数据库地址连接</title><link>https://www.hepuhua.cn/post/991.html</link><description>&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;phpMyAdmin4.8.5 是基于php环境搭建的mysql数据库图形化管理器&amp;nbsp; 数据库地址默认为localhost连接&amp;nbsp; 现在有个需求就是默认的数据库地址连接localhost更改为172.21.89远程地址连接应该如何进行呢&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;text-wrap-mode: wrap;&quot;&gt;phpMyAdmin4.8.5文件下载phpMyAdmin4.8.5.rar&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;ue-upload&quot; style=&quot;line-height: 16px;&quot;&gt;&lt;img style=&quot;vertical-align: middle; margin-right: 2px;&quot; src=&quot;https://www.hepuhua.cn/zb_system/image/filetype/rar.png&quot;/&gt;&lt;a style=&quot;font-size:12px; color:#0066cc;&quot; href=&quot;https://www.hepuhua.cn/zb_users/upload/2026/01/202601291769657150298072.rar&quot; title=&quot;phpMyAdmin4.8.5.rar&quot;&gt;phpMyAdmin4.8.5.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;修改&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color:#ff0000;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;libraries文件夹下的config.default.php文件&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color:#ff0000;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2026/01/202601291769657052274796.png&quot; alt=&quot;image.png&quot; width=&quot;1279&quot; height=&quot;699&quot; style=&quot;width: 1279px; height: 699px;&quot;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color:#ff0000;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1、查找$cfg[&amp;#39;PmaAbsoluteUri&amp;#39;] ，将其值设置为你本地的phpmyadmin路径，例如http://127.21.8.9/admin/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;2、查找cfg[′Servers′][i][&amp;#39;host&amp;#39;] ， 将其值设置为你mysql数据库地址，例如172.21.8.9&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;3、查找cfg[′Servers′][i][&amp;#39;user&amp;#39;] ， 将其值设置为你mysql数据库用户名，例如abcd&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;4、查找cfg[′Servers′][i][&amp;#39;password&amp;#39;] ， 将其值设置为你mysql数据库密码，例如abcd&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;三、通过你本地的phpmyadmin路径（同第二步设置的路径），通过你的mysql数据库用户名密码即可访问远程数据库。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color:#ff0000;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2026/01/202601291769657274193545.png&quot; alt=&quot;image.png&quot; width=&quot;1231&quot; height=&quot;564&quot; style=&quot;width: 1231px; height: 564px;&quot;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color:#ff0000;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color:#ff0000;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color:#ff0000;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 29 Jan 2026 11:17:13 +0800</pubDate></item><item><title>记录使用MinIO作为文件分布式存储服务的使用方法</title><link>https://www.hepuhua.cn/post/990.html</link><description>&lt;p&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MinIO 是一种高性能、S3 兼容的对象存储。它是为 大规模 AI/ML、数据湖和数据库工作负载。它是软件定义的 并在任何云或本地基础设施上运行。 MinIO 具有双重许可 根据开源 GNU AGPL v3 和商业企业许可证&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;一、下载MinIO依赖&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;io.minio&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;minio&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;7.1.0&amp;lt;/version&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;dependency&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;&lt;br/&gt;&amp;lt;/dependency&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;二、MinIO工具类&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;package com.sl.util;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;import com.baomidou.mybatisplus.core.toolkit.StringUtils;&lt;br/&gt;import io.minio.*;&lt;br/&gt;&lt;br/&gt;import io.minio.http.Method;&lt;br/&gt;import io.minio.messages.Item;&lt;br/&gt;import lombok.SneakyThrows;&lt;br/&gt;import org.apache.http.client.utils.URIBuilder;&lt;br/&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br/&gt;import org.springframework.beans.factory.annotation.Value;&lt;br/&gt;import org.springframework.stereotype.Component;&lt;br/&gt;&lt;br/&gt;import java.io.ByteArrayInputStream;&lt;br/&gt;import java.io.InputStream;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; * minio&lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;操作类&lt;br/&gt; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt;&lt;/span&gt;@Component&lt;br/&gt;public class MinioUtils {&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;@Value(&amp;quot;${minio.buccketName}&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp;private String buccketName;&lt;br/&gt; &amp;nbsp; &amp;nbsp;@Autowired&lt;br/&gt; &amp;nbsp; &amp;nbsp;private MinioClient client;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;创建桶&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@SneakyThrows&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void createBucket(String bucketName) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean found =&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;client.bucketExists(BucketExistsArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucketName).build());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!found) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;client.makeBucket(&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MakeBucketArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;()&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.bucket(bucketName)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.region(&amp;quot;cn-beijing&amp;quot;)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.build());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;删除桶&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@SneakyThrows&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void removeBucket(String bucketName) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;client.removeBucket(RemoveBucketArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucketName).build());&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;获取文件信息&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;objectName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;文件名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@return&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@SneakyThrows&lt;br/&gt; &amp;nbsp; &amp;nbsp;public ObjectStat getObjectInfo(String bucketName, String objectName) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return client.statObject(StatObjectArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucketName).object(objectName).build());&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;上传文件&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;objectName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;文件名&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;stream &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;流&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;fileSize &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;文件大小&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;type &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;文件类型&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@throws &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;Exception&lt;br/&gt; &amp;nbsp; &amp;nbsp; */&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;public void putObject(String bucketName, String objectName, InputStream stream, Long fileSize, String type) throws Exception {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;client.putObject(&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PutObjectArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucketName).object(objectName).stream(&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;stream, fileSize, -1)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.contentType(type)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.build());&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;判断文件夹是否存在&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;prefix &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;文件夹名字&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@return&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@SneakyThrows&lt;br/&gt; &amp;nbsp; &amp;nbsp;public Boolean folderExists(String bucketName, String prefix) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Iterable&amp;lt;Result&amp;lt;Item&amp;gt;&amp;gt; results = client.listObjects(ListObjectsArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucketName)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.prefix(prefix).recursive(false).build());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (Result&amp;lt;Item&amp;gt; result:results){&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Item item = result.get();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (item.isDir()){&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;创建文件夹&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;path &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;路径&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@SneakyThrows&lt;br/&gt; &amp;nbsp; &amp;nbsp;public void createFolder(String bucketName,String path) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;client.putObject(PutObjectArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucketName).object(path)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.stream(new ByteArrayInputStream(new byte[]{}),0,-1).build());&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;获取文件在&lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;minio&lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;在服务器上的外链&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;objectName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;文件名&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@return&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;@SneakyThrows&lt;br/&gt; &amp;nbsp; &amp;nbsp;public String getObjectUrl(String bucketName,String objectName){&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return client.getPresignedObjectUrl(&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GetPresignedObjectUrlArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;()&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .method(Method.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;GET&lt;/span&gt;)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.bucket(bucketName)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.object(objectName)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.build());&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;获取&lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;minio&lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;永不失效的外链&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;fileName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;文件名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@return &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;外链接&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;public String getPreviewUrl(String fileName, String bucketName) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (StringUtils.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;isNotBlank&lt;/span&gt;(fileName)) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String bucket = bucketName == null ? this.buccketName : bucketName;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;client.statObject(StatObjectArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucket).object(fileName).build());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String url = client.getPresignedObjectUrl(&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GetPresignedObjectUrlArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;()&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.method(Method.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;GET&lt;/span&gt;)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.bucket(bucket)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.object(fileName)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.build());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;URIBuilder uriBuilder = new URIBuilder(url);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;uriBuilder.removeQuery();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return uriBuilder.build().toString();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;获取&lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;minio&lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;永久外链&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;fileName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;文件名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@param &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;bucketName &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;桶名称&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: #FF0000;&quot;&gt;@return &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;外链接&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;public String getPermanentUrl(String fileName, String bucketName) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (StringUtils.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;isNotBlank&lt;/span&gt;(fileName)) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String bucket = bucketName == null ? this.buccketName : bucketName;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace; color: #FF0000;&quot;&gt;检查对象是否存在&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;client.statObject(StatObjectArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucket).object(fileName).build());&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &lt;span style=&quot;font-family: 宋体, monospace; color: #FF0000;&quot;&gt;返回永久链接&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;return client.getObjectUrl(bucket, fileName);&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;/**&lt;br/&gt; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;根据&lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;font-style: italic; font-family: 宋体, monospace; color: #FF0000;&quot;&gt;删除服务器上的文件&lt;br/&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;*/&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;public boolean deleteFileByUrl(String bucketName,String fileName,String folder) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;client.removeObject(RemoveObjectArgs.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;builder&lt;/span&gt;().bucket(bucketName).object(folder + fileName).build());&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;out&lt;/span&gt;.println((&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace; color: #FF0000;&quot;&gt;删除&lt;/span&gt;&amp;quot; + bucketName + &amp;quot;&lt;span style=&quot;font-family: 宋体, monospace; color: #FF0000;&quot;&gt;下的文件&lt;/span&gt;&amp;quot; + folder + fileName + &amp;quot;&lt;span style=&quot;font-family: 宋体, monospace; color: #FF0000;&quot;&gt;成功&lt;/span&gt;&amp;quot;));&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.&lt;span style=&quot;font-style: italic; color: #FF0000;&quot;&gt;out&lt;/span&gt;.println((&amp;quot;&lt;span style=&quot;font-family: 宋体, monospace; color: #FF0000;&quot;&gt;删除文件失败&lt;/span&gt;:{}&amp;quot;+ e.getMessage()));&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp;}&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;把tehn存储桶权限由private更改为custom的配置文件如下：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markdown&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Version&amp;quot;:&amp;nbsp;&amp;quot;2012-10-17&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Statement&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Effect&amp;quot;:&amp;nbsp;&amp;quot;Allow&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Principal&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;AWS&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;*&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Action&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;s3:GetBucketLocation&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;s3:ListBucket&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Resource&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;arn:aws:s3:::tehn&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Effect&amp;quot;:&amp;nbsp;&amp;quot;Allow&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Principal&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;AWS&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;*&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Action&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;s3:GetObject&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Resource&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;arn:aws:s3:::tehn/*&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
}&lt;/pre&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 07 Jan 2026 12:18:30 +0800</pubDate></item><item><title>麒麟系统安装docker时发现yum install-y yum-utils报错  No match for argument：Unable to find a match</title><link>https://www.hepuhua.cn/post/989.html</link><description>&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;安装docker 遇到yum install -y yum-utils报错，No match for argument：Unable to find a match&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2025/12/202512161765875772299175.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;下载&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;可用的.repo文件&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;
wget&amp;nbsp;-O&amp;nbsp;/etc/yum.repos.d/CentOS-Base.repo&amp;nbsp;https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo&lt;/pre&gt;&lt;p&gt;#注&amp;nbsp;wget&amp;nbsp;-O … （此处为大写的英文字母O）&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2025/12/202512161765875818815338.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;输入带版本的安装命令就可以了&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;sudo&amp;nbsp;yum&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;--releasever=8&amp;nbsp;yum-utils&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2025/12/202512161765875876486255.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 16 Dec 2025 17:00:40 +0800</pubDate></item><item><title>JAR包在linux系统中后台进行常驻并开机自启动 jar包自启jar包后台启动jar自启动jar后台启动</title><link>https://www.hepuhua.cn/post/988.html</link><description>&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin-top: 24px; margin-right: 0px; margin-bottom: 8px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: 600; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 24px; font-synthesis-style: auto; overflow-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span class=&quot;words-blog hl-git-1&quot; data-tit=&quot;Linux系统&quot; data-pretit=&quot;linux系统&quot; style=&quot;box-sizing: border-box; outline: 0px; margin: 0px 3px 0px 0px; padding: 0px 18px 0px 0px; font-weight: normal; font-synthesis-style: auto; overflow-wrap: break-word; cursor: pointer; background: url(&amp;quot;../img/gitcode-key.png&amp;quot;) right center / 14px 14px no-repeat transparent; box-shadow: none; color: #4EA1DB !important;&quot;&gt;Linux系统&lt;/span&gt;配置开机自动启动Java项目&lt;/h5&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;blockquote style=&quot;box-sizing: border-box; outline: 0px; padding: 16px; margin: 0px 0px 24px; color: rgba(0, 0, 0, 0.5); border-left: 8px solid rgb(221, 223, 228); background: rgb(238, 240, 244); overflow: auto; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; word-break: break-word !important;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 0px; padding: 0px; font-size: 14px; color: rgb(85, 86, 102); line-height: 22px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;在我们写完项目后，项目后端要部署到服务器上。如遇到服务器出现故障导致重启，项目还需要手动进行启动，才不会影响项目的正常运行。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;&lt;br/&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h6 style=&quot;box-sizing: border-box; outline: 0px; margin-top: 24px; margin-right: 0px; margin-bottom: 8px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: 600; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 24px; font-synthesis-style: auto; overflow-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a id=&quot;1_3&quot; style=&quot;box-sizing: border-box; outline: none; margin: 0px; padding: 0px; font-weight: normal; cursor: pointer; background-color: transparent; color: rgb(78, 161, 219); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&lt;/a&gt;1、准备工作&lt;/h6&gt;&lt;ul style=&quot;box-sizing: border-box; outline: 0px; margin-bottom: 24px; padding: 0px; list-style-position: initial; list-style-image: initial; font-size: 16px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; color: rgba(0, 0, 0, 0.75); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;Linux中Java的路径&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;项目jar包绝对路径&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;项目外置配置文件（没有可不准备）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h6 style=&quot;box-sizing: border-box; outline: 0px; margin-top: 24px; margin-right: 0px; margin-bottom: 8px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: 600; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 24px; font-synthesis-style: auto; overflow-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a id=&quot;2jar_autosh_7&quot; style=&quot;box-sizing: border-box; outline: none; margin: 0px; padding: 0px; font-weight: normal; cursor: pointer; background-color: transparent; color: rgb(78, 161, 219); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&lt;/a&gt;2、创建自启脚本jar_auto.sh&lt;/h6&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在/etc/rc.d/init.d目录下创建jar_auto.sh文件&lt;code style=&quot;box-sizing: border-box; outline: 0px; font-family: &amp;quot;Source Code Pro&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Anonymous Pro&amp;quot;, &amp;quot;Droid Sans Mono&amp;quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 14px; line-height: 22px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 2px; padding: 2px 4px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;可使用vi命令或touch命令创建jar_auto.sh&lt;/code&gt;，文件名称可自定义&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;改变目录
cd&amp;nbsp;/etc/rc.d/init.d
#&amp;nbsp;创建文件
vi&amp;nbsp;jar_auto.sh
#&amp;nbsp;或&amp;nbsp;touch&amp;nbsp;jar_auto.sh&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;创建好后编写自定义启动&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;脚本内容&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#!/bin/bash

#&amp;nbsp;表示延迟30秒启动
sleep&amp;nbsp;10
#&amp;nbsp;配置jar包启动的路径&amp;nbsp;日志生成路径&amp;nbsp;&amp;nbsp;nohup表示静默启动
#&amp;nbsp;两种启动jar包命令的写法，one.使用java的绝对路径的命令，two.使用已配置好的全局java命令（根据自己喜好二选一即可）
#&amp;nbsp;one.使用java的绝对路径的命令
nohup&amp;nbsp;java&amp;nbsp;-Djava.awt.headless=true&amp;nbsp;-Duser.timezone=Asia/Shanghai&amp;nbsp;-Xmx1024M&amp;nbsp;-Xms256M&amp;nbsp;-jar&amp;nbsp;/home/durkblue/jar/atomo/atmospheric-electric-meter-0.0.1-SNAPSHOT.jar&amp;nbsp;&amp;amp;
nohup&amp;nbsp;java&amp;nbsp;-Djava.awt.headless=true&amp;nbsp;-Duser.timezone=Asia/Shanghai&amp;nbsp;-Xmx1024M&amp;nbsp;-Xms256M&amp;nbsp;-jar&amp;nbsp;/home/durkblue/jar/devicePro/devicePro-1.1.0.jar&amp;nbsp;&amp;amp;
nohup&amp;nbsp;java&amp;nbsp;-Djava.awt.headless=true&amp;nbsp;-Duser.timezone=Asia/Shanghai&amp;nbsp;-Xmx1024M&amp;nbsp;-Xms256M&amp;nbsp;-jar&amp;nbsp;/home/durkblue/jar/netty/nettydamo-0.0.1-SNAPSHOT.jar&amp;nbsp;&amp;amp;
nohup&amp;nbsp;java&amp;nbsp;-Djava.awt.headless=true&amp;nbsp;-Duser.timezone=Asia/Shanghai&amp;nbsp;-Xmx1024M&amp;nbsp;-Xms256M&amp;nbsp;-jar&amp;nbsp;/home/durkblue/jar/onenet/onenet-device-gateway-0.0.1-SNAPSHOT.jar&amp;nbsp;&amp;amp;
#&amp;nbsp;two.使用已配置好的全局java命令
#nohup&amp;nbsp;java&amp;nbsp;-mx256M&amp;nbsp;-Diname=buss-admin&amp;nbsp;-Xrs&amp;nbsp;-jar&amp;nbsp;/home/application/bussManager/lib/buss-admin.jar&amp;nbsp;--spring.config.location=/home/application/bussManager/conf/application.yml&amp;nbsp;&amp;gt;&amp;nbsp;/home/application/bussManager/logs/buss-admin.log&amp;amp;
#&amp;nbsp;如果有多个jar需要启动，可以继续按照one或two配置。如下：
#nohup&amp;nbsp;java&amp;nbsp;-jar&amp;nbsp;/home/application/bussManager/jar/one.jar&amp;nbsp;&amp;gt;&amp;nbsp;/home/application/bussManager/logs/one.log&amp;amp;
#nohup&amp;nbsp;java&amp;nbsp;-jar&amp;nbsp;/home/application/bussManager/jar/two.jar&amp;nbsp;&amp;gt;/home/application/bussManager/logs/two.log&amp;amp;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;如果有需要延时启动，可以使用&lt;code style=&quot;box-sizing: border-box; outline: 0px; font-family: &amp;quot;Source Code Pro&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Anonymous Pro&amp;quot;, &amp;quot;Droid Sans Mono&amp;quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 14px; line-height: 22px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 2px; padding: 2px 4px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;sleep + 数字（标识延迟多少秒启动）&lt;/code&gt;进行设置&lt;/span&gt;&lt;/p&gt;&lt;h6 style=&quot;box-sizing: border-box; outline: 0px; margin-top: 24px; margin-right: 0px; margin-bottom: 8px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: 600; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 24px; font-synthesis-style: auto; overflow-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a id=&quot;3_33&quot; style=&quot;box-sizing: border-box; outline: none; margin: 0px; padding: 0px; font-weight: normal; cursor: pointer; background-color: transparent; color: rgb(78, 161, 219); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;&lt;/a&gt;3、为&lt;span class=&quot;words-blog hl-git-1&quot; data-tit=&quot;脚本文件&quot; data-pretit=&quot;脚本文件&quot; style=&quot;box-sizing: border-box; outline: 0px; margin: 0px 3px 0px 0px; padding: 0px 18px 0px 0px; font-weight: normal; font-synthesis-style: auto; overflow-wrap: break-word; cursor: pointer; background: url(&amp;quot;../img/gitcode-key.png&amp;quot;) right center / 14px 14px no-repeat transparent; box-shadow: none; color: #4EA1DB !important;&quot;&gt;脚本文件&lt;/span&gt;赋予执行权限&lt;/h6&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;code style=&quot;box-sizing: border-box; outline: 0px; font-family: &amp;quot;Source Code Pro&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Anonymous Pro&amp;quot;, &amp;quot;Droid Sans Mono&amp;quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 14px; line-height: 22px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 2px; padding: 2px 4px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;使用**chmod +x** 命令标识将该文件设置为可执行文件&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;chmod&amp;nbsp;+x&amp;nbsp;/etc/rc.d/init.d/jar_auto.sh&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#赋予执行权限&lt;/pre&gt;&lt;h6 style=&quot;box-sizing: border-box; outline: 0px; margin-top: 24px; margin-right: 0px; margin-bottom: 8px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: 600; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 24px; font-synthesis-style: auto; overflow-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;4、为jar脚本赋予开机自启权限&lt;/h6&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;编辑&lt;code style=&quot;box-sizing: border-box; outline: 0px; font-family: &amp;quot;Source Code Pro&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Anonymous Pro&amp;quot;, &amp;quot;Droid Sans Mono&amp;quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 14px; line-height: 22px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 2px; padding: 2px 4px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;/etc/rc.d&lt;/code&gt;目录下的&lt;code style=&quot;box-sizing: border-box; outline: 0px; font-family: &amp;quot;Source Code Pro&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Anonymous Pro&amp;quot;, &amp;quot;Droid Sans Mono&amp;quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 14px; line-height: 22px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 2px; padding: 2px 4px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;rc.local&lt;/code&gt;文件，将jar启动脚本加入该文件中即可。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;vim&amp;nbsp;/etc/rc.d/rc.local&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;rc.&lt;/span&gt;&lt;span class=&quot;words-blog hl-git-1&quot; data-tit=&quot;local&quot; data-pretit=&quot;local&quot; style=&quot;box-sizing: border-box; outline: 0px; margin: 0px 3px 0px 0px; padding: 0px 18px 0px 0px; font-synthesis-style: auto; overflow-wrap: break-word; cursor: pointer; background: url(&amp;quot;../img/gitcode-key.png&amp;quot;) right center / 14px 14px no-repeat #FFFFFF; box-shadow: none; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; color: #4EA1DB !important;&quot;&gt;local&lt;/span&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;文件中加入jar启动脚本文件绝对路径，如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;rc.local文件
/etc/rc.d/init.d/jar_auto.sh&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h6 style=&quot;box-sizing: border-box; outline: 0px; margin-top: 24px; margin-right: 0px; margin-bottom: 8px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: 600; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 24px; font-synthesis-style: auto; overflow-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;5、赋予/etc/rc.d/rc.local文件执行权限&lt;/h6&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;code style=&quot;box-sizing: border-box; outline: 0px; font-family: &amp;quot;Source Code Pro&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Anonymous Pro&amp;quot;, &amp;quot;Droid Sans Mono&amp;quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 14px; line-height: 22px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 2px; padding: 2px 4px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;将jar脚本文件目录添加到rc.local文件后，需要为文件重新赋予执行权限，执行**chmod -x**命令&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; outline: 0px; font-weight: 700; font-synthesis-style: auto; overflow-wrap: break-word; color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: no-common-ligatures; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;
chmod&amp;nbsp;+x&amp;nbsp;/etc/rc.d/rc.local&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4F4F4F; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; font-variant-ligatures: no-common-ligatures; font-weight: 600; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;6、使用reboot命令重启Linux系统，使用ps -ef | grep buss-admin 命令查看是否启动成功！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4F4F4F; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; font-variant-ligatures: no-common-ligatures; font-weight: 600; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4F4F4F; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; font-variant-ligatures: no-common-ligatures; font-weight: 600; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;重启系统
reboot
#&amp;nbsp;启动完成后查看jar包是否已启动
ps&amp;nbsp;-ef&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;buss-admin&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #4F4F4F; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; font-variant-ligatures: no-common-ligatures; font-weight: 600; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;img src=&quot;https://www.hepuhua.cn/zb_users/upload/2025/12/202512101765358103774838.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 10 Dec 2025 16:59:32 +0800</pubDate></item></channel></rss>