nodejs S3 Bucket Upload скрипт многоразового использования - PullRequest
0 голосов
/ 14 января 2019

Эй, ребята, я пытаюсь загрузить файл на s3. Я успешно могу сделать это с помощью следующего кода. Однако я хотел бы сделать его немного более многоразовым. Я хотел бы иметь возможность использовать такую ​​функцию.

singleFileUpload(fieldName, bucketName, newfileName);

Так что я использую одну и ту же функцию на нескольких страницах, не определяя ее снова и снова. Я также хочу, чтобы он мог возвращать любые ошибки загрузки в блоке try catch. Это возможно? Вот код, который у меня есть, который работает.

var AWS = require("aws-sdk");
var multer = require("multer");
multerS3 = require("multer-s3");
var fs = require("fs");
AWS.config.credentials = {
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  region: "eu-west-1"
};
AWS.config.region = "eu-west-1";
var s3 = new AWS.S3();

var newFileName = "coolNewFileName";
      const fileFilter = (req, file, cb) => {
        var ext = file.originalname.split(".")[1];
        console.log("ext", ext);
        if (ext == "jpg" || ext == "mp4" || ext == "wmv") {
          cb(null, true);
        } else {
          cb(new Error("invalid file format"), false);
        }
      };

      var upload = multer({
        fileFilter,
        storage: multerS3({
          s3,
          bucket: process.env.BUCKET_NAME,
          acl: "public-read",
          metadata: function(req, file, cb) {
            cb(null, { fieldName: "testing_meta_data!" });
          },
          key: function(req, file, cb) {
            console.log(file);
            let fileExtension = file.originalname.split(".")[1];
            cb(null, newFileName + "." + fileExtension);
          }
        })
      });
      var singleUpload = upload.single("image");
      singleUpload(req, res, function(err) {
        if (err) {
          data.error = true;
          data.message = err.message;
          console.log(data);
          res.json(data);
        } else {
          // res.json({ imageurl: req.file.location });
          data.fileUploadLocation = req.file.location;
          console.log(data.fileUploadLocation);
        }
      });

Любая помощь здесь была бы фантастической, спасибо.

Ответы [ 2 ]

0 голосов
/ 28 июля 2019

С помощью этой строки вы можете сделать свой код более безопасным. Aws-sdk знает, где искать ваши учетные данные.

удалить:

Aws.config.credentials блок

Добавить:

const credentials = new AWS.SharedIniFileCredentials({profile: 'name-of-profile'});

0 голосов
/ 15 января 2019

Вот как это делается, поместите следующий код в отдельный файл. Файл aws содержит include для aws и конфигурацию s3. Вот так:

    var AWS = require("aws-sdk");
    AWS.config.credentials = {
      accessKeyId: process.env.AWS_ACCESS_KEY_ID,
      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
      region: "eu-west-1"
    };
    AWS.config.region = "eu-west-1";

    var s3 = new AWS.S3();

    module.exports = { AWS, s3 };

var AWS = require("../AWS").AWS;
var s3 = require("../AWS").s3;
var multer = require("multer");
var multerS3 = require("multer-s3");

, чем я включаю следующий код, например, так:

let singleFileUpload = require ("../ upload");

Наконец, я строю функцию в файле upload / index.js следующим образом:

function singleFileUpload(req, res, newFileName, bucketName, fieldName) {
  var fileFilter = (req, file, cb) => {
    var ext = file.originalname.split(".").slice(-1);
    console.log("ext", ext);
    if (ext == "jpg" || ext == "mp4" || ext == "wmv") {
      cb(null, true);
    } else {
      cb(new Error("invalid file format"), false);
    }
  };
  var upload = multer({
    fileFilter,
    storage: multerS3({
      s3,
      bucket: bucketName,
      acl: "public-read",
      metadata: function(req, file, cb) {
        cb(null, { test: "testing_meta_data!" });
      },
      key: function(req, file, cb) {
        console.log(file);
        let fileExtension = file.originalname.split(".")[1];
        cb(null, newFileName + "." + fileExtension);
      }
    })
  });
  var singleUpload = upload.single(fieldName);
  singleUpload(req, res, error => {
    if (error) {
      throw error;
    } else {
      console.log("it worked");
    }
  });
}

module.exports = singleFileUpload;

Я затем запускаю функцию следующим образом:

 var newFileName = "Testing";
  var fieldName = "image";
  singleFileUpload(
    req,
    res,
    newFileName,
    process.env.BUCKET_NAME,
    fieldName
  );
...