使用Node.js分片上传大文件到阿里云OSS

阿里云OSS的分片上传(Multipart Upload)是一种针对大文件优化的上传方式,其核心流程和关键特性如下:

1. ‌核心流程‌
分片上传分为三个步骤:

  • 初始化任务‌:调用InitiateMultipartUpload接口创建上传任务,获取唯一标识(Upload ID)。
  • 上传分片‌:通过UploadPart接口并发上传切分后的文件块(Part),每个Part需指定序号(partNumber),但上传顺序不影响最终合并。
  • 合并文件‌:调用CompleteMultipartUpload接口将所有Part按序号合并为完整文件。若中途放弃上传,需调用AbortMultipartUpload清理未完成的Part。

2. 适用场景‌

  • 大文件加速上传‌:文件超过5GB时,分片上传通过并行传输显著提升速度。
  • 网络环境波动‌:单个Part失败仅需重传该部分,避免全文件重传。
  • 暂停与恢复‌:任务无过期时间,可随时中断后继续上传。
  • 未知文件大小‌:如视频监控等场景,可在文件生成过程中开始上传。

3. 技术细节与建议‌

  • ‌分片大小‌:官方建议文件大于100MB时采用分片上传,过小分片可能导致进度显示异常。
  • 并发控制‌:并非并发数越多越快,需权衡网络带宽和设备负载。
  • ‌安全实践‌:浏览器端使用时应通过临时访问凭证(STS)授权,避免暴露主账号密钥。
  • ‌跨域配置‌:浏览器直接上传需预先设置OSS的CORS规则。

4. 操作方式‌

  • 工具支持‌:OSS控制台不支持分片上传,需使用ossbrowser(图形化工具)、ossutil(命令行)或SDK(如Browser.js、阿里云SDK)。
  • 代码示例‌:Vue项目中可通过ali-oss SDK实现分片上传,结合进度条组件(如Element UI)提升用户体验。

5. 注意事项‌

  • ‌碎片清理‌:未完成的分片会占用存储空间,需手动调用AbortMultipartUpload或配置生命周期规则自动清理。
  • 费用影响:未清理的分片会产生存储费用,每月费用 = 分片大小 × 分片数量 × 存储单价 × 存储天数。始终对放弃的上传调用
    abortMultipartUpload
  • 自动清理机制:OSS 默认 7 天后清理未完成的分片。可通过生命周期规则缩短:
xml:
<LifecycleConfiguration><Rule><AbortIncompleteMultipartUpload><DaysAfterInitiation>1</DaysAfterInitiation> <!-- 1天后清理 --></AbortIncompleteMultipartUpload></Rule>
</LifecycleConfiguration>
  • API灵活性‌:若需高度定制化,可直接调用REST API(需自行计算签名)。
    在这里插入图片描述

一:阿里官方文档:Node.js用一个步骤实现分片上传
二:阿里官方文档:Node.js分三个步骤实现分片上传,可扩展暂停/继续上传和取消上传操作
在这里插入图片描述

一个步骤实现:

以上分片上传完整示例调用的方法multipartUpload中封装了初始化分片上传、上传分片以及完成分片上传三个API接口。如果您希望分步骤实现分片上传,请依次调用.initMultipartUpload、.uploadPart以及.completeMultipartUpload方法。
在这里插入图片描述
在这里插入图片描述

<template><div class="upload-container"><el-upload ref="upload" drag action="" :auto-upload="false" :on-change="handleFileChange" :limit="1" :on-exceed="handleExceed"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div></el-upload><el-button style="margin-top: 20px;" type="primary" @click="uploadFile" :disabled="!isupload">开始上传</el-button><el-progress v-if="uploading" :text-inside="true" :stroke-width="26" :percentage="uploadPercentage"></el-progress></div>
</template><script>
import OSS from 'ali-oss'; // npm install ali-oss
import md5 from 'js-md5'; // npm install js-md5
export default {data() {return {file: null,uploading: false,isupload: false,uploadPercentage: 0,};},methods: {handleFileChange(file) {this.file = file.raw;this.isupload = true;},handleExceed() {this.$message.warning('只能上传一个文件');},async uploadFile() {if (!this.file) {this.$message.error('请先选择文件');return;}this.uploading = true;try {let content = this.setConfig(this.$ossConfig);//这里涉及身份识别,我这里是取接口返回在解密获得(如上图),下同,不再解释console.log(content)const client = new OSS({region: content.region,bucket: content.bucket,accessKeyId: content.accessKeyId,accessKeySecret: content.accessKeySecret,stsToken: content.securityToken,});const fileName = `uploads/${this.file.name}`;const options = {partSize: 1024 * 1024 * 5, // 分片大小为 5MBparallel: 3, // 并发上传的分片数量progress: (p, cpt, res) => {this.uploadPercentage = Math.round(p * 100);},};const result = await client.multipartUpload(fileName, this.file, options);this.$message.success('文件上传成功');console.log('Upload result:', result);} catch (error) {this.$message.error('文件上传失败');console.error('Upload error:', error);} finally {this.uploading = false;this.uploadPercentage = 0;}},setConfig(content) {let Base64 = require('js-base64').Base64let str1 = Base64.decode(content.substr(1, 3) + content.substr(5, 3) + content.substr(9, content.length - 9));let contentN = Base64.decode(str1.substr(1, 3) + str1.substr(5, 3) + str1.substr(9, str1.length - 9));return JSON.parse(contentN);},},
};
</script><style scoped>
.upload-container {max-width: 600px;margin: 20px auto;padding: 20px;border: 1px solid #ebeef5;border-radius: 4px;
}
</style>

效果:
在这里插入图片描述
在这里插入图片描述

扩展:一个步骤扩展暂停/继续上传、取消上传

<template><div class="upload-container"><!-- <el-upload ref="uploadRef" class="upload-demo" drag :action="''" :auto-upload="false" :show-file-list="false" accept="*" :limit="2" :on-change="handleChange" :on-exceed="handleExceed"> --><el-upload ref="uploadRef" class="upload-demo" drag :action="''" :auto-upload="true" :show-file-list="false" accept="*" :limit="1" :before-upload="handleChange"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传3</em></div></el-upload><div v-if="file" class="file-info"><div>文件名称: {{ file.name }}</div><div>文件大小: {{ formatFileSize(file.size) }}</div><div>分片大小: {{ (chunkSize / 1024 / 1024).toFixed(2) }} MB</div><div>分片数量: {{ chunks }}</div></div><el-progress v-if="showProgress && !isUploaded" :percentage="percentage" :status="uploadStatus" :stroke-width="16" style="margin: 20px 0"></el-progress><el-button v-if="isUploaded" type="text">上传成功</el-button><div v-if="showButtons"><!-- <el-button type="primary" @click="submitForm" v-if="!isUploading && !isUploaded && !tempCheckpoint">开始上传</el-button> --><el-button type="primary" icon="el-icon-refresh-left" @click="submitForm" v-if="!isUploading && !isUploaded && !tempCheckpoint">重试</el-button><el-button type="text" @click="shareclearn" v-if="isUploaded">分享 | 清除记录</el-button><el-button type="primary" icon="el-icon-video-pause" @click="pauseUpload()" v-if="paused && isUploading && !isUploaded">暂停上传</el-button><el-button type="primary" icon="el-icon-video-play" @click="resumeUpload()" v-if="!paused && !isUploaded">继续上传</el-button><el-button type="danger" icon="el-icon-circle-close" @click="cancelUpload" v-if="!isUploaded && tempCheckpoint">取消上传</el-button></div></div>
</template><script>
import OSS from 'ali-oss'
import md5 from 'js-md5'export default {data() {return {client: null,parallel: 3, // 并发上传的分片数量chunkSize: 2 * 1024 * 1024, // 分片大小 2MBchunks: 0,// 总分片数量file: null,ossKey: '',uploadStatus: null, // 进度条上传状态percentage: 0, // 进度条百分比showProgress: false,// 是否显示进度条showButtons: false,// 是否显示按钮tempCheckpoint: null, // 用于缓存当前切片内容uploadId: '',isUploading: false,// 是否上传中isUploaded: false,//是否上传完毕paused: true,//是否暂停};},created() {this.initOSSClient();},methods: {async initOSSClient() {try {let content = this.setConfig(this.$ossConfig);console.log(content)this.client = new OSS({region: content.region,bucket: content.bucket,accessKeyId: content.accessKeyId,accessKeySecret: content.accessKeySecret,stsToken: content.securityToken,});} catch (error) {console.error('OSS初始化失败:', error);this.$message.error('上传服务初始化失败');}},setConfig(content) {let Base64 = require('js-base64').Base64let str1 = Base64.decode(content.substr(1, 3) + content.substr(5, 3) + content.substr(9, content.length - 9));let contentN = Base64.decode(str1.substr(1, 3) + str1.substr(5, 3) + str1.substr(9, str1.length - 9));return JSON.parse(contentN);},// 选择文件async handleChange(file) {// console.log(file)this.resetState();this.file = file//.raw;this.ossKey = `uploads/${Date.now()}_${this.file.name}`;this.chunks = Math.ceil(this.file.size / this.chunkSize);this.showButtons = true;this.submitForm();},// 开始上传submitForm() {this.initMultipartUpload();this.multipartUpload();},// 初始化分片上传async initMultipartUpload() {const result = await this.client.initMultipartUpload(this.ossKey);this.uploadId = result.uploadId;console.log(`初始化分片上传成功, uploadId: ${this.uploadId}`);},// 开始分片上传async multipartUpload() {if (!this.file) {this.$message.error('请选择文件');return;}this.uploadStatus = null;this.percentage = 0;this.showProgress = true;this.isUploading = true;try {const result = await this.client.multipartUpload(this.file.name, this.file, {progress: (p, checkpoint) => {this.tempCheckpoint = checkpoint;// this.uploadId = checkpoint.uploadId;this.percentage = Math.floor(p * 100);},parallel: this.parallel,partSize: this.chunkSize,});this.uploadStatus = 'success';this.isUploading = false;this.isUploaded = true;this.$message.success('上传成功');console.log(result, '切片上传完毕');} catch (e) {if (e.code === 'ConnectionTimeoutError') {this.uploadStatus = 'exception';window.addEventListener('online', this.resumeUpload);}this.isUploading = false;console.error(e);}},// 取消上传cancelUpload() {this.pauseUpload();this.paused = true;this.showProgress = false;this.percentage = 0;this.uploadStatus = null;this.tempCheckpoint = null;this.uploadId = '';},// 暂停上传pauseUpload() {this.isUploading = false;this.paused = false;this.client.cancel();},// 继续上传async resumeUpload() {if (!this.tempCheckpoint) {this.$message.error('请先上传');return;}this.uploadStatus = null;this.isUploading = true;this.paused = true;try {const result = await this.client.multipartUpload(this.file.name, this.file, {progress: (p) => {this.percentage = Math.floor(p * 100);},checkpoint: this.tempCheckpoint,});this.uploadStatus = 'success';this.isUploading = false;this.isUploaded = true;this.$message.success('续传成功');console.log(result, '恢复上传完毕');} catch (e) {this.isUploading = false;console.error(e);}},// 重置resetState() {this.file = null;this.ossKey = '';this.uploadStatus = null;this.percentage = 0;this.showProgress = false;this.showButtons = false;this.tempCheckpoint = null;this.uploadId = '';this.isUploading = false;this.isUploaded = false;this.paused = true;},// 限制上传一个文件,重新选择文件替换原来的文件handleExceed(files) {// console.log(this.$refs.uploadRef)if (this.$refs.uploadRef.uploadFiles.length > 1) {this.$refs.uploadRef.uploadFiles.shift();}},// 格式化文件大小formatFileSize(size) {const units = ['B', 'KB', 'MB', 'GB'];let unitIndex = 0;while (size >= 1024 && unitIndex < units.length - 1) {size /= 1024;unitIndex++;}return `${size.toFixed(2)} ${units[unitIndex]}`;},shareclearn() {console.log('分享 | 清除记录')},},
};
</script><style scoped>
.upload-container {width: 100%;max-width: 600px;margin: 0 auto;
}.el-button {margin-right: 10px;
}.file-info {margin: 20px 0;padding: 15px;background-color: #f8f9fa;border-radius: 4px;
}.file-info div {margin-bottom: 10px;color: #606266;
}
</style>

效果:

一个步骤分片上传(扩展暂停继续取消)

三个步骤实现:

<template><div class="upload-container"><!-- multiple drag on-change --><el-upload class="upload-demo" action="" :show-file-list="false" :auto-upload="true" :before-upload="handleFileChange" :accept="'*'"><!-- <i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> --><el-button size="small" type="primary">选择文件</el-button></el-upload><div class="file-info" v-if="file"><div>文件名: {{ file.name }}</div><div>文件大小: {{ formatFileSize(file.size) }}</div><div>分片大小: {{ (chunkSize / 1024 / 1024).toFixed(2) }} MB</div><div>分片数量: {{ chunks }}</div><el-progress v-if="isUploading" :percentage="progressPercent" :status="uploadStatus" :stroke-width="14"></el-progress><div><el-button type="primary" :icon="isPaused?'el-icon-video-play':'el-icon-video-pause'" @click="togglePause" v-if="isUploading">{{ isPaused ? '继续' : '暂停' }}</el-button><el-button type="danger" icon="el-icon-circle-close" @click="cancelUpload" v-if="isUploading">取消</el-button><el-button type="primary" icon="el-icon-refresh-left" @click="startUpload" v-if="!isUploading && !uploaded">重试</el-button><el-button type="text" v-if="!isUploading && uploaded">分享 | 清除记录</el-button></div></div></div>
</template><script>
import OSS from 'ali-oss'
import md5 from 'js-md5'export default {data() {return {file: null,chunkSize: 2 * 1024 * 1024, // 5MB 分片chunks: 0,                  // 分片数量uploadedChunks: [],  // 已上传的分片索引uploadId: '',        // OSS 分片上传 IDclient: null,        // OSS 客户端isPaused: false,     // 是否暂停isUploading: false,  // 上传中uploaded: false,     // 上传完成progressPercent: 0,  // 进度条-百分比uploadStatus: null,  // 进度条-状态concurrency: 3,      // 并发数activeChunks: 0,     // 当前活跃的分片数cancelTokens: {},    // 取消令牌parts: [],           // 分片列表};},created() {this.initOSSClient();},methods: {async initOSSClient() {// 这里应该从后端获取临时凭证(安全考虑)// 以下是模拟数据,实际使用需替换为真实接口const credentials = await this.getSTSToken();this.client = new OSS({region: credentials.region,accessKeyId: credentials.accessKeyId,accessKeySecret: credentials.accessKeySecret,stsToken: credentials.securityToken,bucket: credentials.bucket,refreshSTSToken: async () => {const newCredentials = await this.getSTSToken();return {accessKeyId: newCredentials.accessKeyId,accessKeySecret: newCredentials.accessKeySecret,stsToken: newCredentials.securityToken};}});},async getSTSToken() {// 实际项目中从这里获取STS token// 示例返回结构:var content = this.setConfig(this.$ossConfig);console.log(content)return {region: content.region,bucket: content.bucket,accessKeyId: content.accessKeyId,accessKeySecret: content.accessKeySecret,securityToken: content.securityToken,};},setConfig(content) {let Base64 = require('js-base64').Base64let str1 = Base64.decode(content.substr(1, 3) + content.substr(5, 3) + content.substr(9, content.length - 9));let contentN = Base64.decode(str1.substr(1, 3) + str1.substr(5, 3) + str1.substr(9, str1.length - 9));return JSON.parse(contentN);},// 格式化文件大小formatFileSize(size) {const units = ['B', 'KB', 'MB', 'GB'];let unitIndex = 0;while (size >= 1024 && unitIndex < units.length - 1) {size /= 1024;unitIndex++;}return `${size.toFixed(2)} ${units[unitIndex]}`;},// 标准化ETag格式normalizeETag(etag) {let cleanETag = String(etag).replace(/^"+/, '').replace(/"+$/, '').replace(/\\/g, '');if (!/^[0-9A-F]{32}$/i.test(cleanETag)) {throw new Error(`无效的ETag格式: ${etag}`);}return `"${cleanETag}"`;},// 重置上传resetState() {this.uploadedChunks = [];this.uploadId = '';this.isPaused = false;this.isUploading = false;this.uploaded = false;this.progressPercent = 0;this.uploadStatus = null;this.activeChunks = 0;this.cancelTokens = {};// // 取消所有进行中的请求// Object.values(this.cancelTokens).forEach(ctrl => ctrl.abort());// this.cancelTokens = {};// // 强制更新视图// this.$nextTick();},handleFileChange(file) {// console.log(file)this.resetState();this.file = file;//file.raw;this.chunks = Math.ceil(this.file.size / this.chunkSize);this.startUpload();},// 1、初始化分片上传async startUpload() {if (!this.file) return;try {this.isUploading = true;this.isPaused = false;if (!this.uploadId) {const result = await this.client.initMultipartUpload(this.file.name,{ timeout: 60000 });this.uploadId = result.uploadId;console.log(`初始化分片上传成功, uploadId: ${this.uploadId}`);}// 获取未上传的分片const unuploaded = Array.from({ length: this.chunks }, (_, i) => i).filter(i => !this.uploadedChunks.includes(i));// 并发控制const uploadNext = async () => {if (this.isPaused || !this.isUploading) return;// 上传完,合并分片if (unuploaded.length === 0 && this.activeChunks === 0) {await this.completeUpload();return;}if (this.activeChunks < this.concurrency && unuploaded.length > 0) {const chunkIndex = unuploaded.shift();this.activeChunks++;// 取消步骤一:创建取消令牌,取消正在进行的 HTTP 请求(分片上传请求)const controller = new AbortController();this.cancelTokens[chunkIndex] = controller;// 2、调用上传分片-sthis.uploadChunk(chunkIndex, controller.signal).then((res) => {// console.log(res)// console.log(chunkIndex)// this.parts.push({ partNumber: chunkIndex + 1, etag: res.etag });this.uploadedChunks.push(chunkIndex);this.updateProgress();}).catch(err => {if (err.name !== 'AbortError') {console.error(`分片 ${chunkIndex} 上传失败:`, err);}}).finally(() => {this.activeChunks--;delete this.cancelTokens[chunkIndex];uploadNext();});// 调用上传分片-euploadNext();}};// 启动并发上传for (let i = 0; i < this.concurrency; i++) {uploadNext();}} catch (err) {console.error('上传初始化失败:', err);this.$message.error('上传初始化失败');this.resetState();}},// 2、分片上传async uploadChunk(index, signal) {const start = index * this.chunkSize;const end = Math.min(start + this.chunkSize, this.file.size);const chunk = this.file.slice(start, end);return this.client.uploadPart(this.file.name,this.uploadId,index + 1,chunk,signal,);},// 3、完成上传async completeUpload() {try {// 获取已上传分片列表const listParts = await this.client.listParts(this.file.name,this.uploadId,);// console.log(listParts)// 按分片号排序const sortedParts = listParts.parts.sort((a, b) => a.partNumber - b.partNumber);// console.log(sortedParts)this.parts = await sortedParts.map(p => ({number: Number(p.PartNumber),//!!!注意!!!键名只能用numberetag: this.normalizeETag(p.ETag),//!!!注意!!!键名只能用etag}))// console.log(this.parts)// 完成上传const completeResult = await this.client.completeMultipartUpload(this.file.name,this.uploadId,this.parts,);console.log(completeResult)this.$message.success('完成上传-成功');this.uploadStatus = 'success';this.uploaded = true;this.isUploading = false;} catch (err) {this.uploadStatus = 'exception';console.error('完成上传-失败:', err);this.$message.error('完成上传-失败');}},// 暂停/继续 上传togglePause() {this.isPaused = !this.isPaused;if (!this.isPaused) {this.startUpload();}},// 取消上传 cancelUpload() {this.isUploading = false;// 取消所有正在上传的分片Object.values(this.cancelTokens).forEach(controller => {controller.abort();});// 取消步骤二:清理OSS上传记录,清理掉OSS上存储的所有已经上传的分片,终止本次分片上传过程,并删除所有已上传的分片数据。// 这样确保不会在 OSS 上留下无效的分片数据,避免产生不必要的存储费用。if (this.uploadId && this.file) {try {this.client.abortMultipartUpload(this.file.name, this.uploadId).finally(() => {this.resetState();}).catch((err) => {console.error('取消上传失败:', err)});} catch (err) {console.error('OSS清理异常:', err);}}this.$message.info('上传已取消');// 使用Vue的强制更新视图(针对Element UI进度条)this.$nextTick(() => {this.$forceUpdate();});},// 更新进度条updateProgress() {// 如果不在上传状态,不更新进度if (!this.isUploading) return;const percent = Math.round((this.uploadedChunks.length / this.chunks) * 100);this.progressPercent = Math.min(percent, 100);},}
};
</script><style scoped>
.upload-container {max-width: 600px;margin: 20px auto;padding: 20px;border: 1px solid #ebeef5;border-radius: 4px;
}
.upload-demo {width: 300px;margin: 0 auto;
}
.file-info {margin-top: 20px;padding: 15px;background-color: #f8f9fa;border-radius: 4px;
}
.file-info div {margin-bottom: 10px;color: #606266;
}
.el-progress {margin-top: 20px;
}
</style>

效果:

三个步骤分片上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ if语句完全指南:从基础到工程实践

一、选择结构在程序设计中的核心地位 程序流程控制如同城市交通网络&#xff0c;if语句则是这个网络中的决策枢纽。根据ISO C标准&#xff0c;选择结构占典型项目代码量的32%-47%&#xff0c;其正确使用直接影响程序的&#xff1a; 逻辑正确性 执行效率 可维护性 安全边界 …

【大模型LLM学习】Flash-Attention的学习记录

【大模型LLM学习】Flash-Attention的学习记录 0. 前言1. flash-attention原理简述2. 从softmax到online softmax2.1 safe-softmax2.2 3-pass safe softmax2.3 Online softmax2.4 Flash-attention2.5 Flash-attention tiling 0. 前言 Flash Attention可以节约模型训练和推理时间…

python打卡day46@浙大疏锦行

知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意力后的特征图和热力图 内…

JavaSec-SPEL - 表达式注入

简介 SPEL(Spring Expression Language)&#xff1a;SPEL是Spring表达式语言&#xff0c;允许在运行时动态查询和操作对象属性、调用方法等&#xff0c;类似于Struts2中的OGNL表达式。当参数未经过滤时&#xff0c;攻击者可以注入恶意的SPEL表达式&#xff0c;从而执行任意代码…

SpringCloud——OpenFeign

概述&#xff1a; OpenFeign是基于Spring的声明式调用的HTTP客户端&#xff0c;大大简化了编写Web服务客户端的过程&#xff0c;用于快速构建http请求调用其他服务模块。同时也是spring cloud默认选择的服务通信工具。 使用方法&#xff1a; RestTemplate手动构建: // 带查询…

【深入学习Linux】System V共享内存

目录 前言 一、共享内存是什么&#xff1f; 共享内存实现原理 共享内存细节理解 二、接口认识 1.shmget函数——申请共享内存 2.ftok函数——生成key值 再次理解ftok和shmget 1&#xff09;key与shmid的区别与联系 2&#xff09;再理解key 3&#xff09;通过指令查看/释放系统中…

探索 Java 垃圾收集:对象存活判定、回收流程与内存策略

个人主页-爱因斯晨 文章专栏-JAVA学习笔记 热门文章-赛博算命 一、引言 在 Java 技术体系里&#xff0c;垃圾收集器&#xff08;Garbage Collection&#xff0c;GC&#xff09;与内存分配策略是自动内存管理的核心支撑。深入探究其原理与机制&#xff0c;对优化程序内存性能…

hbase资源和数据权限控制

hbase适合大数据量下点查 https://zhuanlan.zhihu.com/p/471133280 HBase支持对User、NameSpace和Table进行请求数和流量配额限制&#xff0c;限制频率可以按sec、min、hour、day 对于请求大小限制示例&#xff08;5K/sec,10M/min等&#xff09;&#xff0c;请求大小限制单位如…

大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森林 Bagging Boosting

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大模型篇章已经开始&#xff01; 目前已经更新到了第 22 篇&#xff1a;大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…

Delphi 实现远程连接 Access 数据库的指南

方法一&#xff1a;通过局域网共享 Access 文件&#xff08;简单但有限&#xff09; 步骤 1&#xff1a;共享 Access 数据库 将 .mdb 或 .accdb 文件放在局域网内某台电脑的共享文件夹中。 右键文件夹 → 属性 → 共享 → 启用共享并设置权限&#xff08;需允许网络用户读写&a…

VR视频制作有哪些流程?

VR视频制作流程知识 VR视频制作&#xff0c;作为融合了创意与技术的复杂制作过程&#xff0c;涵盖从初步策划到最终呈现的多个环节。在这个过程中&#xff0c;我们可以结合众趣科技的产品&#xff0c;解析每一环节的实现与优化&#xff0c;揭示背后的奥秘。 VR视频制作有哪些…

文件上传/下载接口开发

接口特性 文件传输接口与传统接口的核心差异体现在数据传输格式&#xff1a; 上传接口采用 multipart/form-data 格式支持二进制文件传输下载接口接收二进制流并实现本地文件存储 文件上传接口开发 接口规范 请求地址&#xff1a;/createbyfile 请求方式&#xff1a;POST…

深入学习RabbitMQ队列的知识

目录 1、AMQP协议 1.1、介绍 1.2、AMQP的特点 1.3、工作流程 1.4、消息模型 1.5、消息结构 1.6、AMQP 的交换器类型 2、RabbitMQ结构介绍 2.1、核心组件 2.2、最大特点 2.3、工作原理 3、消息可靠性保障 3.1、生产端可靠性 1、生产者确认机制 2、持久化消息 3.…

【计算机网络】NAT、代理服务器、内网穿透、内网打洞、局域网中交换机

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a;【计算机网络】数据链路层——ARP协议 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、网络地址转…

[论文阅读] 人工智能 | 大语言模型计划生成的新范式:基于过程挖掘的技能学习

#论文阅读# 大语言模型计划生成的新范式&#xff1a;基于过程挖掘的技能学习 论文信息 Skill Learning Using Process Mining for Large Language Model Plan Generation Andrei Cosmin Redis, Mohammadreza Fani Sani, Bahram Zarrin, Andrea Burattin Cite as: arXiv:2410.…

C文件操作2

五、文件的随机读写 这些函数都需要包含头文件 #include<stdio.h> 5.1 fseek 根据文件指针的位置和偏移量来定位文件指针&#xff08;文件内容的光标&#xff09; &#xff08;重新定位流位置指示器&#xff09; int fseek ( FILE * stream, long int offset, int or…

react私有样式处理

react私有样式处理 Nav.jsx Menu.jsx vue中通过scoped来实现样式私有化。加上scoped&#xff0c;就属于当前组件的私有样式。 给视图中的元素都加了一个属性data-v-xxx&#xff0c;然后给这些样式都加上属性选择器。&#xff08;deep就是不加属性也不加属性选择器&#xff09; …

【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3

❝ KubeSphere V4已经开源半年多&#xff0c;而且v4.1.3也已经出来了&#xff0c;修复了众多bug。介于V4优秀的LuBan架构&#xff0c;核心组件非常少&#xff0c;资源占用也显著降低&#xff0c;同时带来众多功能和便利性。我们决定与时俱进&#xff0c;使用1.30版本的Kubernet…

单片机内部结构基础知识 FLASH相关解读

一、总线简单说明 地址总线、控制总线、数据总线 什么是8位8051框架结构的微控制器&#xff1f; 数据总线宽度为8位&#xff0c;即CPU一次处理或传输的数据量为8位&#xff08;1字节&#xff09; 同时还有一个16位的地址总线&#xff0c;这个地方也刚好对应了为什么能看到内存…

HTTPS加密的介绍

HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff0c;超文本传输安全协议&#xff09;是HTTP协议的安全版本。它在HTTP的基础上加入了SSL/TLS协议&#xff0c;用于对数据进行加密&#xff0c;并确保数据传输过程中的机密性、完整性和身份验证。 在HTTPS出现之前&a…