使用七牛云、阿里云、腾讯云的对象存储上传文件
说明:存在部分步骤省略的情况,请根据具体文档进行操作
下载相关sdk
composer require qiniu/php-sdkcomposer require aliyuncs/oss-sdk-php
composer require alibabacloud/sts-20150401composer require qcloud/cos-sdk-v5
composer require qcloud_sts/qcloud-sts-sdk# 如果不需要,请移除,示例:
# composer remove qcloud_sts/qcloud-sts-sdk
use Qiniu\Auth;
use AlibabaCloud\SDK\Sts\V20150401\Sts;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Sts\V20150401\Models\AssumeRoleRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;require_once __DIR__ . 'vendor/autoload.php';class oss
{public function qiniuPolicy(){$domain = ''; // 访问oss文件的域名$bucket = ''; // 空间名称$accessKey = '';$secretKey = '';$endpoint = ''; // 上传文件的地址,例如:https://up-z2.qiniup.com$prefix = ''; // 指定bucket目录前缀$dir = $prefix . '/' . date('Ymd') . '/'; // 按日期上传到指定目录$expire = time() + 3600;$policyArr = ['scope' => $bucket,'deadline' => $expire,'fsizeMin' => 1,'fsizeLimit' => 10 * 1024 * 1024,];$auth = new Auth($accessKey, $secretKey);$token = $auth->uploadToken($bucket, null, 3600, $policyArr);if (empty($token)) {return [];}return ['endpoint' => $endpoint,'host' => $domain,'accessId' => '','policy' => '','signature' => '','token' => $token,'expire' => $expire,'keyTime' => '','algorithm' => '','dir' => $dir,];}public function aliPolicy(){// https://help.aliyun.com/zh/oss/use-cases/obtain-signature-information-from-the-server-and-upload-data-to-oss$domain = ''; // 访问oss文件的域名$bucket = ''; // 空间名称$accessKey = '';$secretKey = '';$endpoint = ''; // 上传文件的地址,例如:https://{bucket名称}.oss-cn-shenzhen.aliyuncs.com$prefix = ''; // 指定bucket目录前缀$dir = $prefix . '/' . date('Ymd') . '/'; // 按日期上传到指定目录// https://help.aliyun.com/zh/oss/developer-reference/postobject#section-d5z-1ww-wdb$expire = time() + 3600;$policyArr = ['expiration' => date('Y-m-d\TH:i:s.000\Z', $expire),'conditions' => [['bucket' => $bucket],['content-length-range', 1, 10 * 1024 * 1024],]];$policy = base64_encode(json_encode($policyArr));// https://help.aliyun.com/zh/oss/developer-reference/postobject#section-wny-mww-wdb$signature = base64_encode(hash_hmac('sha1', $policy, $secretKey, true));return ['endpoint' => $endpoint,'host' => $domain,'accessId' => $accessKey,'policy' => $policy,'signature' => $signature,'token' => '','expire' => $expire,'keyTime' => '','algorithm' => '','dir' => $dir,];}public function aliSts(){// https://help.aliyun.com/zh/oss/developer-reference/authorize-access-2try {// 填写步骤1创建的RAM用户AccessKey。$config = new Config(["accessKeyId" => "【填写】","accessKeySecret" => "【填写】"]);//$config->endpoint = "【填写】"; // sts.cn-hangzhou.aliyuncs.com$client = new Sts($config);$assumeRoleRequest = new AssumeRoleRequest([// roleArn填写步骤2获取的角色ARN,例如acs:ram::175708322470****:role/ramtest。"roleArn" => "【填写】",// roleSessionName用于自定义角色会话名称,用来区分不同的令牌,例如填写为sessiontest。"roleSessionName" => "【填写】",// durationSeconds用于设置临时访问凭证有效时间单位为秒,最小值为900,最大值以当前角色设定的最大会话时间为准。本示例指定有效时间为3000秒。"durationSeconds" => 3000,// policy填写自定义权限策略,用于进一步限制STS临时访问凭证的权限。如果不指定Policy,则返回的STS临时访问凭证默认拥有指定角色的所有权限。// 临时访问凭证最后获得的权限是步骤4设置的角色权限和该Policy设置权限的交集。// "policy" => ""]);$runtime = new RuntimeOptions([]);$result = $client->assumeRoleWithOptions($assumeRoleRequest, $runtime);//printf("AccessKeyId:" . $result->body->credentials->accessKeyId. PHP_EOL);//printf("AccessKeySecret:".$result->body->credentials->accessKeySecret.PHP_EOL);//printf("Expiration:".$result->body->credentials->expiration.PHP_EOL);//printf("SecurityToken:".$result->body->credentials->securityToken.PHP_EOL);}catch (Exception $e){// printf($e->getMessage() . PHP_EOL);return [];}return $result;}public function qcloudPolicy(){// https://cloud.tencent.com/document/product/436/14690$domain = ''; // 访问oss文件的域名$bucket = ''; // 空间名称$accessKey = '';$secretKey = '';$endpoint = ''; // 上传文件的地址,例如:https://{bucket名称}.cos.ap-guangzhou.myqcloud.com$prefix = ''; // 指定bucket目录前缀$dir = $prefix . '/' . date('Ymd') . '/'; // 按日期上传到指定目录$algorithm = 'sha1';$startTime = time();$endTime = time() + 3600;$expiration = date('Y-m-d\TH:i:s.000\Z', $endTime);$keyTime = implode(';', [$startTime, $endTime]);$policyArr = ['expiration' => $expiration,'conditions' => [['acl' => 'default'],['bucket' => $bucket],['q-sign-algorithm' => $algorithm],['q-ak' => $secretId],['q-sign-time' => $keyTime]]];$policy = base64_encode(json_encode($policyArr));$signKey = hash_hmac($algorithm, $keyTime, $secretKey);$stringToSign = sha1(json_encode($policyArr));$signature = hash_hmac($algorithm, $stringToSign, $signKey);return ['endpoint' => $endpoint,'host' => $domain,'accessId' => $secretId,'policy' => $policy,'signature' => $signature,'token' => '','expire' => $endTime,'keyTime' => $keyTime,'algorithm' => $algorithm,'dir' => $dir,];}public function qcloudSts(){// https://cloud.tencent.com/document/product/436/14048// https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/php/demo/sts_test.php$domain = config('oss.qcloud_domain');$bucket = config('oss.qcloud_bucket');$secretId = config('oss.qcloud_access_key');$secretKey = config('oss.qcloud_secret_key');$endpoint = config('oss.qcloud_endpoint');$prefix = config('oss.qcloud_bucket_key_prefix');$dir = $prefix . '/' . date('Ymd') . '/';$region = 'ap-guangzhou';$sts = new \QCloud\COSSTS\Sts();$config = array('url' => 'https://sts.tencentcloudapi.com/', // url和domain保持一致'domain' => 'sts.tencentcloudapi.com', // 域名,非必须,默认为 sts.tencentcloudapi.com'proxy' => '','secretId' => $secretId, // 固定密钥,若为明文密钥,请直接以'xxx'形式填入,不要填写到getenv()函数中'secretKey' => $secretKey, // 固定密钥,若为明文密钥,请直接以'xxx'形式填入,不要填写到getenv()函数中'bucket' => $bucket, // 换成你的 bucket'region' => $region, // 换成 bucket 所在园区'durationSeconds' => 3600, // 密钥有效期'allowPrefix' => ['*'], // 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)// 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923'allowActions' => array(// 简单上传'name/cos:PutObject','name/cos:PostObject',// 分片上传'name/cos:InitiateMultipartUpload','name/cos:ListMultipartUploads','name/cos:ListParts','name/cos:UploadPart','name/cos:CompleteMultipartUpload'),// 临时密钥生效条件,关于condition的详细设置规则和COS支持的condition类型可以参考 https://cloud.tencent.com/document/product/436/71306'condition' => []);// 获取临时密钥,计算签名$tempKeys = $sts->getTempKeys($config);return $tempKeys ?: [];/**
数据如下:
{"expiredTime": 1691169303,"expiration": "2023-08-04T17:15:03Z","credentials": {"sessionToken": "","tmpSecretId": "","tmpSecretKey": ""},"requestId": "6b274db5-a86b-4e27-a0e9-50f8ae1832f4","startTime": 1691165703
}
*/}
}
表单提交到七牛云
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>七牛云oss upload</title>
</head>
<body>
<form method="post" action="{来自于$data里面的endpoint}" enctype="multipart/form-data"><input type="hidden" name="key" id="key" value=""><input type="hidden" name="token" id="token" value=""><input type="hidden" name="crc32" /><input type="hidden" name="accept" /><input type="file" name="file" id="file" onchange="change(this)" /><input type="submit" value="上传文件" id="submit"/>
</form>
<script>// 实例化oss类,获取数据// $oss = new oss();// $data = $oss->qiniuPolicy();let eleKey = document.getElementById('key');let eleToken = document.getElementById('token');eleToken.value = ''; // 来自$data里面的tokenfunction change(obj) {let uploadDir = ''; // 来自$data里面的dirlet fname = uploadDir + obj.files[0]['name'];console.log(fname);eleKey.value = fname;}
</script>
</body>
</html>
表单提交到阿里云
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>阿里云oss upload</title>
</head>
<body>
<form method="post" action="{来自于$data里面的endpoint}" enctype="multipart/form-data"><input type="hidden" name="key" id="key" value=""><input type="hidden" name="OSSAccessKeyId" id="accessKey" value=""><input type="hidden" name="policy" id="policy" value=""><input type="hidden" name="signature" id="signature" value=""><input name="file" type="file" id="file" onchange="change(this)" /><input type="submit" value="上传文件" id="submit"/>
</form>
<script>// 实例化oss类,获取数据// $oss = new oss();// $data = $oss->aliPolicy();let eleKey = document.getElementById('key');let eleAccessKey= document.getElementById('accessKey');let elePolicy = document.getElementById('policy');let eleSignature = document.getElementById('signature');eleAccessKey.value = ''; // 来自$data里面的accessIdelePolicy.value = ''; // 来自$data里面的policyeleSignature.value = ''; // 来自$data里面的signaturefunction change(obj) {let uploadDir = ''; // 来自$data里面的dirlet fname = uploadDir + obj.files[0]['name'];console.log(fname);eleKey.value = fname;}
</script>
</body>
</html>
表单提交到阿里云(sts)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" /><title>阿里云oss upload</title>
</head>
<body>
<input id="file" type="file" />
<button id="upload">上传</button>
<script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.16.0.min.js"></script>
<script>// yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。let region = '';// 填写Bucket名称。let bucket = '';// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。// 从STS服务获取的安全令牌(SecurityToken)。let stsData = {AccessKeyId:"",AccessKeySecret:"",Expiration:"",SecurityToken:""};const client = new OSS({// yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。region: region,// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。accessKeyId: stsData.AccessKeyId,accessKeySecret: stsData.AccessKeySecret,// 从STS服务获取的安全令牌(SecurityToken)。stsToken: stsData.SecurityToken,// 填写Bucket名称。bucket: bucket});// 从输入框获取file对象,例如<input type="file" id="file" />。let data;// 创建并填写Blob数据。//const data = new Blob(['Hello OSS']);// 创建并填写OSS Buffer内容。//const data = new OSS.Buffer(['Hello OSS']);const upload = document.getElementById("upload");async function putObject (data) {try {// 填写Object完整路径。Object完整路径中不能包含Bucket名称。// 您可以通过自定义文件名(例如exampleobject.txt)或文件完整路径(例如exampledir/exampleobject.txt)的形式实现将数据上传到当前Bucket或Bucket中的指定目录。// data对象可以自定义为file对象、Blob数据或者OSS Buffer。const result = await client.put("1.png",data);console.log(result);} catch (e) {console.log(e);}}upload.addEventListener("click", () => {const data = file.files[0];putObject(data);});
</script>
</body>
</html>
表单提交到腾讯云
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>腾讯云oss upload</title>
</head>
<body>
<form method="post" action="{来自于$data里面的endpoint}" enctype="multipart/form-data"><input type="hidden" name="key" id="key" value=""><input type="hidden" name="acl" id="acl" value="default"><input type="hidden" name="policy" id="policy" value=""><input type="hidden" name="q-sign-algorithm" id="algorithm" value=""><input type="hidden" name="q-ak" id="ak" value=""><input type="hidden" name="q-key-time" id="keyTime" value=""><input type="hidden" name="q-signature" id="signature" value=""><input type="file" name="file" id="file" onchange="change(this)" /><input type="submit" value="上传文件" id="submit"/>
</form>
<script>// 实例化oss类,获取数据// $oss = new oss();// $data = $oss->qcloudPolicy();let eleKey = document.getElementById('key');let elePolicy = document.getElementById('policy');let eleAlgorithm = document.getElementById('algorithm');let eleAK = document.getElementById('ak');let eleKeyTime = document.getElementById('keyTime');let eleSignature = document.getElementById('signature');elePolicy.value = ''; // 来自$data里面的policyeleAlgorithm.value = ''; // 来自$data里面的algorithmeleAK.value = ''; // 来自$data里面的accessIdeleKeyTime.value = ''; // 来自$data里面的keyTimeeleSignature.value = ''; // 来自$data里面的signaturefunction change(obj) {let uploadDir = ''; // 来自$data里面的dirlet fname = uploadDir + obj.files[0]['name'];console.log(fname);eleKey.value = fname;}
</script>
</body>
</html>
表单提交到腾讯云(sts)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>腾讯云oss upload</title>
</head>
<body>
<form method="post" action="https://test-1312063917.cos.ap-guangzhou.myqcloud.com" enctype="multipart/form-data"><input type="hidden" name="x-cos-security-token" id="token" value=""><input type="hidden" name="key" id="key" value=""><input type="file" name="file" id="file" onchange="change(this)" /><input type="submit" value="上传文件" id="submit"/>
</form>
<script>// 实例化oss类,获取数据// $oss = new oss();// $data = $oss->qcloudSts();let eleKey = document.getElementById('key');let eleToken = document.getElementById('token');eleToken.value = ''; // $data['credentials']['sessionToken']function change(obj) {let uploadDir = ''; // 来自$data里面的dirlet fname = uploadDir + obj.files[0]['name'];console.log(fname);eleKey.value = fname;}
</script>
</body>
</html>
相关文章:
使用七牛云、阿里云、腾讯云的对象存储上传文件
说明:存在部分步骤省略的情况,请根据具体文档进行操作 下载相关sdk composer require qiniu/php-sdkcomposer require aliyuncs/oss-sdk-php composer require alibabacloud/sts-20150401composer require qcloud/cos-sdk-v5 composer require qcloud_s…...

使用阿里云DataX完成数据同步
DataX DataX 是阿里云 DataWorks 数据集成的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, datab…...

《Kali渗透基础》13. 无线渗透(三)
kali渗透 1:无线通信过程1.1:Open 认证1.2:PSK 认证1.3:关联请求 2:加密2.1:Open 无加密网络2.2:WEP 加密系统2.3:WPA 安全系统2.3.1:WPA12.3.2:WPA2 3&#…...

python——案例六:判断字符串的长度
案例六:判断字符串的长度str"Study"print(len(str))#输出结果如下: #5...
PC-windows-安卓-Linux音频系统框架概论
+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) 一 PC 音频系统工作原理 PC音频系统的工作原理可以简要概括为以下几个步骤: 音频输入:音频信号可以通过多种方式输入到计算机,例如麦克风、线路输入、数字音频接口等。这些音频源会将声音转换为电信号。 模数转换…...

Web Worker API
Web Worker API Web Worker 使得在一个独立于 Web 应用程序主执行线程的后台线程中运行脚本操作成为可能。这样做的好处是可以在独立线程中执行费时的处理任务,使主线程(通常是 UI 线程)的运行不会被阻塞/放慢。 Web Worker概念与用法 Wor…...
1.4 MA多头/空头排列是真的吗?
MA策略验证——金叉和死叉 文章目录 MA策略验证——金叉和死叉公共代码论证步骤论证代码论证结果写在最后公共代码 code = 注意,这里改成股票代码 pro = ts.pro_api(tushare的token)df = pro.daily(ts_code=code)[...

基于SpringBoot+Vue的CSGO赛事管理系统设计与实现(源码+LW+部署文档等)
博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…...

Android系统APP之SettingsProvider
前言 SettingsProvider顾名思义是一个提供设置数据共享的Provider,SettingsProvider和Android系统其它Provider有很多不一样的地方,如: SettingsProvider只接受int、float、string等基本类型的数据;SettingsProvider由Android系…...
go入门实践二-tcp服务端
文章目录 前言接口与方法并发-协程项目管理bufio包使用其他代码 前言 上一篇,我们通过go语言的hello-world入门,搭建了go的编程环境,并对go语法有了简单的了解。本文实现一个go的tcp服务端。借用这个示例,展示接口、协程、bufio的…...

SprinMVC获取请求参数
SprinMVC获取请求参数 Spring MVC 提供的获取请求参数的方式 通过 HttpServletRequest 获取请求参数通过控制器方法的形参获取请求参数使用 RequestParam 注解获取请求参数通过实体类对象获取请求参数(推荐) 通过ServlstAPI获取 将HttpServletRequest…...

orangepi 4lts ubuntu安装RabbitMQ
4lts的emmc 系统安装选文件系统格式 ext4 需先安装erlang: sudo apt install erlang 安装RabbitMQ: sudo apt install rabbitmq-server - 添加用户以便远程访问: - 账号密码都是admin: sudo rabbitmqctl add_user admin admin -sudo rabbitmqct…...

SolidWorks 3D Interconnect介绍
目前市面上有的三维设计软件有很多,如UG、Pro/E、CATIA等,而且每个三维设计软件都会生成自己文件格式。由于产品设计的原因,我们避免不了的会需要去使用不同三维设计软件的文件,这对于工程师来说其实是一件比较麻烦的事。 为什么…...
MBG中update语句的区别
int updateByPrimaryKey(User record) thorws SQLException 按主键更新 int updateByPrimaryKeySelective(User record) thorws SQLException 按主键更新值不为null的字段 使用以上的方式更新数据时必须提供主键,MyBatis根据主键进行数据记录的更新。 int updateBy…...

论文阅读 - Few-shot Network Anomaly Detection via Cross-network Meta-learning
论文链接:https://arxiv.org/pdf/2102.11165.pdf 目录 摘要: 引言 问题定义 方法 Graph Deviation Networks Cross-network Meta-learning 摘要: 网络异常检测旨在找到与绝大多数行为显着不同的网络元素(例如节点、边、子图…...

秋招算法备战第37天 | 738.单调递增的数字、968.监控二叉树、贪心算法总结
738. 单调递增的数字 - 力扣(LeetCode) 这个问题是关于找到一个小于或等于给定数字n的最大单调递增数字。 我们可以将数字n转换为字符数组,然后从左到右扫描,寻找第一个违反单调递增条件的位置。一旦找到这样的位置,…...

Windows server上用nginx部署vue3项目
Windows server上用nginx部署vue3项目 一、Node中node_modules文件夹及package.json文件的作用说明二、VUE3项目打包三、Windows Server上的Nginx部署 一、Node中node_modules文件夹及package.json文件的作用说明 node_modules是安装node后用来存放用包管理工具下载安装的包的…...

计算机视觉与图形学-神经渲染专题-pi-GAN and CIPS-3D
《pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis》 摘要 我们见证了3D感知图像合成的快速进展,利用了生成视觉模型和神经渲染的最新进展。然而,现有的方法在两方面存在不足:首先,它们…...

【FAQ】EasyGBS平台通道显示在线,视频无法播放并报错400的排查
EasyGBS是基于国标GB28181协议的视频云服务平台,它可以支持国标协议的设备接入,在视频能力上能实现直播、录像存储、检索与回放、云台控制、告警上报、语音对讲、平台级联等功能,既能作为业务平台使用,也能作为能力层平台调用。 我…...
G1和CMS
G1垃圾回收器要点: 1.什么是G1垃圾回收器: G1是一款专门针对于拥有多核处理器和大内存的机器的收集器,在满足了GC响应时间的延迟可控的情况下,也会尽可能提高的程序的吞吐量 2.G1垃圾回收器的优点: ①与CMS收集器一…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...