Axios AWS S3 Put Объект: Ошибка: Ошибка сети - PullRequest
0 голосов
/ 10 июня 2018

Я могу успешно получить подписанный URL-адрес от AWS, но все еще получаю сообщение об ошибке при попытке вставить файл.

// Server.js

server.get('/...', (req, res) => {
const s3 = new AWS.S3();
const fileName = req.query.filename;
const fileType = req.query.filetype;

const s3Params = {
  Bucket: '...',
  Key: fileName,
  Expires: 60,
  ContentType: fileType,
  ACL: 'public-read'
};

s3.getSignedUrl('putObject', s3Params, (err, signedUrl) => {
  if (err) {
    console.log('s3 signed url err', err);
    return res.end();
  }

  const returnData = {
    signedUrl,
    url: `https://....s3.amazonaws.com/${fileName}`
  };

  res.send(JSON.stringify(returnData));
});

});

// Реакция

class ImageUploader extends React.Component {

onDrop = files => {
    // const file = files[0];
    // const fileName = file.name;

    var file = files[0];

    axios.get('/...', {
      params: {
        filename: 'home/banner-images/' + file.name,
        filetype: file.type
      }
    })
    .then(result => {

      const options = {
        headers: {
          'Content-Type': file.type,
          'Access-Control-Allow-Origin': '*',
          "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
          "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
        }
      };

      const instance = axios.create();
      return instance.put(result.data.signedUrl, file, options);
    })
    .then(result => {
      console.log('then then result', result);
    })
    .catch(err => {
      console.log('s3 put err', err);
    });
  };

  render() {
    return (
      <div>
        <Dropzone onDrop={this.onDrop}>
          <div>
            Try dropping a file here, or click to select a file to upload.
          </div>
        </Dropzone>
      </div>
    );
  }
}

Мои политики AWS:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::.../*"
        }
    ]
}



<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

Запрос get успешно извлекает signatureUrl, но запрос put возвращает ошибку:

Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:87)

Это построено поверх Next.js, который доставлял мне много проблем при установке Cognito только для клиентских загрузок.

1 Ответ

0 голосов
/ 10 июля 2018

Не уверен, в чем здесь проблема, но это то, что я получил, работая на React, используя предварительно подписанную ссылку AWS S3 для загрузки файла.

uploadFile (file, uploadUrl, fileKey, tags) {
    const config = { 
      headers: {
        'Content-Type': file.type,
        'x-amz-tagging': getTagging(tags)
      } 
    }
    axios.put(uploadUrl, file, config)
    .then( response => {
      console.log('file upload response', response)
      this.createDocument(file, fileKey)
    })
    .catch( e => {
      console.log('file upload ERROR:', e)
      console.log(' e.response', e.response)
      this.updateStatusOnFile(file.userInterfaceId, DOCUMENT_UPLOAD_STATUS.FAILED)
    })
  }
...