新手求助:Node.js对接Linode Storage无对应SDK,求文件上传方案
使用Node.js接入Linode对象存储的解决方案
Linode 对象存储完全兼容 S3 API,因此无需寻找专属 SDK,直接使用 AWS JavaScript SDK 即可完成文件上传等操作,以下是具体实现步骤:
1. 安装依赖
首先安装 AWS SDK 的相关包:
npm install @aws-sdk/client-s3 @aws-sdk/lib-storage
@aws-sdk/client-s3:核心 S3 客户端,提供基础操作@aws-sdk/lib-storage:提供分片上传能力,适合大文件传输
2. 配置认证与端点
在代码中配置 Linode 对象存储的认证信息及对应数据中心的端点:
- Access Key/Secret Key:从 Linode 控制台的「对象存储」页面生成访问密钥
- Endpoint:根据你的存储桶所在数据中心选择,例如:
- 美国东部:
https://us-east-1.linodeobjects.com - 欧洲中部:
https://eu-central-1.linodeobjects.com - 亚太新加坡:
https://ap-southeast-1.linodeobjects.com
- 美国东部:
3. 实现文件上传
3.1 小文件直接上传(PutObject)
适合几MB以内的文件,代码示例:
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3"); const fs = require('fs'); // 初始化S3客户端 const s3Client = new S3Client({ endpoint: "https://us-east-1.linodeobjects.com", // 替换为你的数据中心端点 credentials: { accessKeyId: "YOUR_LINODE_ACCESS_KEY", // 替换为你的访问密钥 secretAccessKey: "YOUR_LINODE_SECRET_KEY" // 替换为你的密钥密码 }, region: "us-east-1" // 这里填写对应数据中心的标识,和endpoint一致即可 }); // 上传函数 async function uploadSmallFile(bucketName, filePath, remoteFileName) { try { const fileContent = fs.readFileSync(filePath); const command = new PutObjectCommand({ Bucket: bucketName, Key: remoteFileName, // 存储桶中的文件名 Body: fileContent }); const response = await s3Client.send(command); console.log("文件上传成功", response); return response; } catch (err) { console.error("上传失败", err); throw err; } } // 调用示例 uploadSmallFile("my-bucket", "./local-file.jpg", "uploads/file.jpg");
3.2 大文件分片上传(Upload类)
适合大文件(推荐100MB以上),自动分片并处理断点续传:
const { S3Client } = require("@aws-sdk/client-s3"); const { Upload } = require("@aws-sdk/lib-storage"); const fs = require('fs'); const s3Client = new S3Client({ endpoint: "https://us-east-1.linodeobjects.com", credentials: { accessKeyId: "YOUR_LINODE_ACCESS_KEY", secretAccessKey: "YOUR_LINODE_SECRET_KEY" }, region: "us-east-1" }); async function uploadLargeFile(bucketName, filePath, remoteFileName) { try { const upload = new Upload({ client: s3Client, params: { Bucket: bucketName, Key: remoteFileName, Body: fs.createReadStream(filePath) // 用流读取文件,节省内存 }, // 可选:分片大小,默认5MB,可根据需求调整 partSize: 10 * 1024 * 1024 // 10MB }); // 监听上传进度(可选) upload.on("httpUploadProgress", (progress) => { console.log(`上传进度:${Math.round((progress.loaded / progress.total) * 100)}%`); }); const response = await upload.done(); console.log("大文件上传成功", response); return response; } catch (err) { console.error("大文件上传失败", err); throw err; } } // 调用示例 uploadLargeFile("my-bucket", "./big-file.zip", "archives/big-file.zip");
关键注意事项
- 密钥安全:不要在代码中硬编码密钥,建议使用环境变量(如
process.env.LINODE_ACCESS_KEY) - 存储桶权限:确保你的访问密钥拥有对应存储桶的
write权限,或在Linode控制台配置存储桶的CORS规则(如果需要前端直接上传) - 端点匹配:必须使用存储桶所在数据中心的端点,否则会导致连接失败
内容的提问来源于stack exchange,提问作者RORN DEV
相关产品推荐
相关产品推荐

