这里对接的是百度智能云对象存储服务,用的是aws-sdk进行服务对接的,遵照的标准都是AWS S3服务那一套标准。

1、aws s3服务对接的基本配置及操作流程参考博文:https://blog.csdn.net/LegendaryChen/article/details/129775304

2、单个存储文件对象的下载:

// 导入依赖
const AWS = require('aws-sdk');
app.get('/obj', function (req, res) {
  // 配置AWS凭证
  AWS.config.update({
    accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY,
    region: process.env.AWS_S3_REGION,
    endpoint: process.env.AWS_S3_ENDPOINT
  });
  // 初始化S3服务  
  const s3 = new AWS.S3();
  // 图片文件路径和S3存储桶信息
  const keyName = "aaa.jpg";
  // 调用S3的putObject方法上传文件  
  const params = {
    // 这里的AWS_S3_BUCKET可以包含文件夹路径,比如桶名称是myBucket,myBucket下有一个路径aa
    // 则这里的AWS_S3_BUCKET可以设置为‘myBucket/aa’,这里获取到的文件就是‘myBucket/aa/aaa.jpg’
    Bucket: process.env.AWS_S3_BUCKET,
    Key: keyName
  };
  s3.getObject(params, function (err, data) {
    if (err) {
      console.info("下载失败: ", err);
    } else {
      // 文件名称
      res.attachment(params.Key);
      // 文件类型
      res.type(data.ContentType);
      // 文件内容
      res.send(data.Body);
      console.info("下载成功: " + bucketName + "/" + keyName);
    }
  });
});

3、批量文件下载,批量文件下载使用的是s3-zip工具包:

首先下载依赖:npm install s3-zip@^2;注意这里使用的是2.x版本的s3-zip依赖,因为直接使用“npm install s3-zip”下载的版本会有“TypeError: self.s3.send is not a function”错误提示,
具体参考:https://github.com/orangewise/s3-zip/issues/96;具体实现如下:
const AWS = require('aws-sdk');
const s3Zip = require('s3-zip');

app.get("/batchObj", function (req, res) {
  //配置信息
  const S3ClientConfig = new AWS.S3({
    accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY,
    // v4
    signatureVersion: process.env.AWS_S3_SIGNATURE_VERSION,
    s3ForcePathStyle: true,
    // cn-northwest-1
    region: process.env.AWS_S3_REGION,
    endpoint: process.env.AWS_S3_ENDPOINT
  })
  let files = ["hello.jpg", "world.jpg"];
  // 桶下的文件路径
  let folder = "/aa/bb/";
  try {
    s3Zip.archive(
      {
        s3: S3ClientConfig,
        // 注意,这里的bucket不能含有‘/’,只能是桶名称,不能包含文件夹路径
        bucket: process.env.AWS_S3_BUCKET
      },
      folder,
      files
    ).pipe(res)
  } catch (error) {
    console.log(error);
    res.status(500);
  }
});

 以上是nodejs对接aws s3进行文件下载简单的功能实现。

 
 
posted on 2024-11-07 11:00  Judy518  阅读(22)  评论(0编辑  收藏  举报