【问题标题】:Axios AWS S3 Put Object: Error: Network ErrorAxios AWS S3 放置对象:错误:网络错误
【发布时间】:2018-11-19 20:56:58
【问题描述】:

我可以从 AWS 成功获取签名的 url,但尝试放入文件时仍然出错。

// 服务器.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请求成功获取一个signedUrl,但是put请求返回错误:

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

这是建立在 Next.js 之上的,这给我安装 Cognito 以仅用于客户端上传带来了很多问题。

【问题讨论】:

    标签: reactjs amazon-web-services express amazon-s3 axios


    【解决方案1】:

    不确定问题出在哪里,但这是我为 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)
        })
      }
    

    【讨论】:

    • 我遇到了类似的问题。您能说出您从 getTagging 函数收到的数据结构吗?
    【解决方案2】:

    在浏览器中打开签名的URL并检查响应
    可能的错误:

    • 端点错误:更新 AWS.config.Region
    • Cors 错误:在 AWS s3 控制台中更新,将 cors 添加到存储桶中

    【讨论】:

      【解决方案3】:

      我在我的 react 应用中也遇到了同样的问题。然后我使用“fetch”而不是“axios”,它工作得很好。看起来很奇怪,但在我的情况下有效。

      export const uploadImageS3 = (url, file) => { return fetch(
          url,
          {
              'body': file,
              'headers': {
                  'Accept': 'application/json'
              },
              'method': 'PUT'
          }).then(response => {
              // Make sure the response was valid
              if (response.status >= 200 && response.status < 300) {
                  return response;
              }
              const error = new Error(response.statusText);
              error.response = response;
              throw error;   
          }); 
      };
      

      【讨论】:

        猜你喜欢
        • 2021-11-21
        • 2020-08-25
        • 1970-01-01
        • 2018-02-09
        • 2017-04-30
        • 2019-08-03
        • 2019-05-06
        • 2018-08-14
        • 2016-04-01
        相关资源
        最近更新 更多