首页 > 解决方案 > aws S3 存储桶:从浏览器上传 POST 文件时出现内部服务器错误 500

问题描述

<Code>InternalError</Code><Message>We encountered an internal error. Please try again.</Message>在将 POST 表单数据上传到 s3 存储桶时收到。

S3配置:

const attachmentBucket = new Bucket(this, 'caS3Bucket', {
  bucketName: environmentName + '.caattachments',
  cors: [{
    allowedMethods: [HttpMethods.GET, HttpMethods.POST],
    allowedOrigins: ['*'],
    allowedHeaders: ['*'],
    maxAge: 3000
  } as CorsRule]
} as BucketProps);

通过 lambda 预签名上传 url:

const params = {
  Bucket: process.env.S3_BUCKET!.split(':')[5],
  Fields: {
    key: payload.path,
    acl: 'public-read'
  },
  Expires: 3600
};

const postData = await new Promise(resolve => {
  s3.createPresignedPost(params, (err, data) => {
    resolve(data);
  });
}) as AWS.S3.PresignedPost;

我将 postData.fields 中的所有参数附加到文件的输入表单中。有没有办法调试这个?

标签: amazon-web-servicesamazon-s3aws-lambdaaws-cdk

解决方案


问题是表单缺少“策略”字段。我希望 aws 错误更具描述性。最终的工作表单字段如下所示:

const formData: FormData = new FormData();

formData.append('key', uploadData.fields.key);
formData.append('acl', uploadData.fields.acl);
formData.append('bucket', uploadData.fields.bucket);
formData.append('X-Amz-Algorithm', uploadData.fields.algorithm);
formData.append('X-Amz-Credential', uploadData.fields.credential);
formData.append('X-Amz-Date', uploadData.fields.date);
formData.append('X-Amz-Security-Token', uploadData.fields.token);
formData.append('Policy', uploadData.fields.policy);
formData.append('X-Amz-Signature', uploadData.fields.signature);
formData.append('file', file, file.name);

推荐阅读