Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: Cannot read property 'byteLength' of undefined - AWS S3 Upload

I'm working on an aws s3 photo upload from a react client and I'm experiencing the following error:

TypeError: Cannot read property 'byteLength' of undefined

I'm assuming there's a flaw in the upload object, but I believe there might be something wrong with the s3/cognito configuration because I receive the same error when I invoked s3.listObjects. I'm following these docs - https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-photo-album-full.html

Any thoughts?

uploadPhoto() {
        const files = document.getElementById("photoUpload").files;
        if (!files.length) {
          return alert("Please choose a file to upload first.");
        }
        const file = files[0];
        const fileName = file.name;
        const albumPhotosKey = encodeURIComponent('screenshots') + "/";
      
        const photoKey = albumPhotosKey + fileName;
        
        // Use S3 ManagedUpload class as it supports multipart uploads
        
        const upload = new AWS.S3.ManagedUpload({
            params: {
              Bucket: <Bucket Name>,
              Key: fileName,
              Body: file
            }
          });

        const promise = upload.promise();
      
        promise.then(
          function(data) {
            alert("Successfully uploaded photo.");
            console.log('UPLOAD: ', data)
          },
          function(err) {
              console.log('ERROR: ', err)
            // return alert("There was an error uploading your photo: ", err.message);
          }
        );
      }
like image 820
Arron J. Linton Avatar asked Jan 20 '21 18:01

Arron J. Linton


3 Answers

I got this error in a React Native app. I was able to fix it by turning off my Dev Tools network inspector.

like image 103
mikeislearning Avatar answered Nov 17 '22 07:11

mikeislearning


I've run the example as described in the docs and it works, so can't reproduce your err. Here's a couple of things to check:

  • Try passing your accesskey and secret into your config object (although I don't recommend this for security reasons, it might indicate where the issue is):
AWSService.config.update({
    region: region,
    accessKeyId: accessKeyId,
    secretKey: secretAccessKey,
    credentials: new AWSService.CognitoIdentityCredentials({
    IdentityPoolId: identityPoolId
    })
});

  • Confirm your your Cognito Identity Pool ID has an IAM policy attached with the following:
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME",
                "arn:aws:s3:::BUCKET_NAME/*"
            ]
        }
    ]
}
like image 4
bmur Avatar answered Nov 17 '22 08:11

bmur


Just in case! Check that your credentials are configured and passed right. And that you have the privileges for the resource in IAM.

I had the error above because i forget to pass the access credentials. It went away once i put them in.

like image 3
Mohamed Allal Avatar answered Nov 17 '22 06:11

Mohamed Allal