You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:02:07