AWS S3正在加载许多文件

问题描述 投票:0回答:1

我需要上传子目录中拆分的许多文件(大约65.000)。

我试图像这样迭代并加载每个文件:

const fs = require("fs");
const path = require("path");
const async = require("async");
const AWS = require("aws-sdk");
const readdir = require("recursive-readdir");
const slash = require("slash");

const { BUCKET, KEY, SECRET } = process.env;
const rootFolder = path.resolve(__dirname, "./");
const uploadFolder = "./test_files/15";
const s3 = new AWS.S3({
  signatureVersion: "v4",
  accessKeyId: KEY,
  secretAccessKey: SECRET,
});

function getFiles(dirPath) {
  return fs.existsSync(dirPath) ? readdir(dirPath) : [];
}

async function deploy(upload) {
  if (!BUCKET || !KEY || !SECRET) {
    throw new Error("you must provide env. variables: [BUCKET, KEY, SECRET]");
  }

  const filesToUpload = await getFiles(path.resolve(__dirname, upload));

  return new Promise((resolve, reject) => {
    async.eachOfLimit(
      filesToUpload,
      10,
      async.asyncify(async (file) => {
        const Key = file.replace(rootFolder + path.sep, "");
        console.log(`uploading: [${slash(Key)}]`);
        var options = { partSize: 5 * 1024 * 1024, queueSize: 4 };
        return new Promise((res, rej) => {
          s3.upload(
            {
              Key: slash(Key),
              Bucket: BUCKET,
              Body: fs.readFileSync(file),
            },
            (err) => {
              if (err) {
                return rej(new Error(err));
              }
              res({ result: true });
            }
          );
        });
      }),
      (err) => {
        if (err) {
          return reject(new Error(err));
        }
        resolve({ result: true });
      }
    );
  });
}

deploy(uploadFolder)
  .then(() => {
    console.log("task complete");
    process.exit(0);
  })
  .catch((err) => {
    console.error(err);
    process.exit(1);
  });

但是在大量上传之后,我有了这个:

Error: Error: NetworkingError: connect ETIMEDOUT IP_S3_AWS

我需要从ec2实例上载这组文件(因为它是图像处理的结果)。我的电脑上有这种行为,我不知道从ec2是否有同样的问题。我已经考虑了全部压缩并上传的方式,但是我需要保留原始目录结构。

我也接受解决问题的新方法。

对不起,我的英语不好。

node.js amazon-web-services amazon-s3 aws-sdk async.js
1个回答
0
投票

使用AWS CLI aws s3 sync命令而不是自己构建它可能会简单得多。

© www.soinside.com 2019 - 2024. All rights reserved.