Как загрузить несколько файлов параллельно на Amazon S3? - PullRequest
1 голос
/ 15 января 2020

Я использую чистый js код и, и у меня есть файл с несколькими входами, который я хочу загрузить его значение в Amazon S3, код загрузки в S3 работает правильно, но когда я загружаю на одном из входные файлы, и он не закончен и не загружен в другой входной файл, код будет перезаписан для второй загрузки, поэтому я попытался использовать код здесь https://medium.com/@iamsohail / how-to-upload-множественные файлы- параллельно-к-amazon-s3-3b9ac3630806

Чтобы загрузить несколько файлов параллельно amazon S3 без конфликтов, но я столкнулся со многими проблемами,

var AWS = require('aws-sdk'),
    multer = require('multer');

var upload = multer({ dest: 'uploads/' });

var fileChooser = document.getElementsByClassName('s3-input');
if (fileChooser) {
  for (var i = 0; i < fileChooser.length; i++) {

    fileChooser[i].addEventListener('change', function () {
        var filechooserr = this;
        var inputFile = $(this);
        console.log(inputFile)
        var s3url = $(this).parent().next();
      var file = this.files[0];
            if (file) {

                // this code to rename input file
            var today = new Date();
            var date = today.getDate()  + '-' + (today.getMonth()+1) + '-' + today.getFullYear();
            var time = today.getHours() + "-" + today.getMinutes() + "-" + today.getSeconds();
            var userId = filechooserr.getAttribute("data-user-id");
            var uniqid = filechooserr.getAttribute("data-uniqid");

            console.log("file name: " + file.name + " file type: " + file.type + "file extention: " + file.name.split('.').pop() );
            if (this.classList.contains('personal-card-img')) {
              var myNewFile = new File([file.name], 'Teachers/personal-card/'+ userId +"-"+ date +"-"+ uniqid + "." + file.name.split('.').pop() , {type: file.type});
            } else if (this.classList.contains('profile-image-s3url')){
              var myNewFile = new File([file.name], 'Teachers/Avatar/'+ userId +"-"+ date +"-"+ uniqid + "." + file.name.split('.').pop() , {type: file.type});
            } else if (this.classList.contains('qualification-s3url')){
                var myNewFile = new File([file.name], 'Teachers/Qualification/'+ userId +"-"+ date +"-"+ uniqid + "." + file.name.split('.').pop() , {type: file.type});

            } else if (this.classList.contains('credit-card-img')){
                var myNewFile = new File([file.name], 'Teachers/Credit-Card/'+ userId +"-"+ date +"-"+ uniqid + "." + file.name.split('.').pop() , {type: file.type});
            } else {
                var myNewFile = new File([file.name], 'Teachers/anythingElse/'+ userId +"-"+ date +"-"+ uniqid + "." + file.name.split('.').pop() , {type: file.type});
            }

                AWS.config.update({
                    accessKeyId: "MYPRIVETKEY",
                    secretAccessKey: "MYACSESSKRY",
                    region: "ap-south-1"
                });

                var s3 = new AWS.S3({
                    httpOptions: {
                        timeout: 1000 * 2000//1sec = 33minutes
                    }
                });
                async function uploadFile(fileName, fileKey) {
                    return new Promise(async function(resolve, reject) {
                        var params = {
                            Bucket: "bucket-name",
                            Key: myNewFile.name,
                            ContentType: myNewFile.type,
                            Body: file,
                            ACL: 'public-read'
                    };
                        await s3.upload(params, function(s3Err, data) {
                            if (s3Err){
                                reject(s3Err);
                            }
                            console.log(`File uploaded successfully at ${data.Location}`);
                             $(s3url).val(data.Location);
                                resolve(data.Location);
                        });
                    });
                }
                var uploadFilePromises = [];
                var screenShot = request.files.screenShots;
                var apk = request.files.apk;
                var cpUpload = upload.fields([{
                        name: screenShot,
                        maxCount:5 
                    },
                    { name: apk, 
                        maxCount:1
                        }
                ]);
                router.post("/updateApp", cpUpload, async function (req, res, next) {
                    console.log("asmaa")
                });
                var apkFileKey = apk;
                uploadFilePromises.push(uploadFile(apk[0], apkFileKey));
                var screenShotFileKey = screenShot;
                uploadFilePromises.push(uploadFile(screenShot[0], screenShotFileKey));
                
                Promise.all(uploadFilePromises).then(async (values) => {
                    console.log(values);
                    }, reason => {
                    console.log(reason);
                });

            } else {
                    console.log("there is no file to upload")
            }
   
        }, false);
     
  }

}

Первая проблема связана с плагином multer: я не знаю, как его использовать. Я новичок в этом, когда я require('multer'); Я получил ошибку в консоли: enter image description here

Uncaught TypeError: требуется не определено

I используйте gulp.js, поэтому я решил эту проблему, добавив этот код

.pipe(rollup({ plugins: [json({compact: true}), babel(), resolve(), commonjs()] }, 'umd'))

, но я думаю, что это не решило проблему, потому что у меня возникла другая проблема:

enter image description here

Uncaught TypeError: Cannot read property 'memoizedProperty' of undefined

Итак, есть ли у кого-нибудь решение загрузить несколько файлов в Amazon Amazon?

1 Ответ

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

Похоже, что вы используете API, предназначенные для node.js (серверный js бегун) в вашем браузере (клиентский js бегун). Если это так, то это не сработает, если используемый вами API предназначен для использования с node.js или аналогичными серверными платформами. Вам нужно скачать node.js, развернуть там свой код и, возможно, установить express. js. В Интернете есть несколько учебных пособий по развертыванию node.js и приложения или страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...