【问题标题】:Amazon S3 file uploaded; however, file could not be opened errorAmazon S3 文件上传;但是,文件无法打开错误
【发布时间】:2021-10-16 12:35:15
【问题描述】:

我正在将图像文件上传到 Amazon S3 存储桶中;但是,当我从 Amazon S3 存储桶下载文件并尝试打开文件 (jpeg) 时,它会返回一条错误消息,指出“无法打开文件。”

我正在通过 AWS API Gateway 作为 POST 方法发送带有图像文件的多部分请求,并在它运行 lambda 函数以将从多部分请求中获得的图像添加到 S3 存储桶中。可能是什么问题?请帮忙谢谢!

下面的代码是一个将图像文件放入 S3 Bucket 的 lambda 函数。

//* Upload Image into S3 Bucket
require("dotenv").config();
const region = process.env.BUCKET_REGION;
const accessKeyId = process.env.ACCESSKEYID;
const secretAccessKey = process.env.SECRETACCESSKEY;

const AWS = require("aws-sdk");
AWS.config.update({ region: "ap-northeast-1" });

const moment = require("moment");
const busboy = require("busboy");
const getRawBody = require("raw-body");
const { gzipSync } = require("zlib");
const { Buffer } = require("buffer");

const dynamodb = new AWS.DynamoDB.DocumentClient();
const tableName = process.env.USERS_TABLE;
const bucketName = process.env.USERS_PROFILE_BUCKET;
const s3 = new AWS.S3({ region, accessKeyId, secretAccessKey });

const util = require("./util");

exports.handler = async (event, context) =>
  new Promise((resolve, reject) => {
    const item = {};
    const filePromises = [];
    var contentType =
      event.headers["Content-Type"] || event.headers["content-type"];
    var bb = new busboy({ headers: { "content-type": contentType } });

    bb.on("file", function (fieldname, file, filename, encoding, mimetype) {
      item.filename = filename;
      getRawBody(file).then((rawFile) => {
        item.data = gzipSync(rawFile);
      });
      file
        .on("data", (data) => {
          console.log("File [%s] got %d bytes", filename, data.length);
        })
        .on("end", () => console.log("File [%s] Finished", fieldname));
    })
      .on("finish", () => {
        console.log("Done parsing form!");
        resolve(item);
      })
      .on("error", (err) => {
        console.log("Failed: ", err);
        return {
          statusCode: 500,
          headers: util.getResponseHeaders(),
          body: JSON.stringify({
            error: "Parsing Failed.",
          }),
        };
      });

    bb.end(event.body);
  }).then((res) => {
    try {
      var params = {
        Bucket: bucketName,
        Key: res.filename,
        Body: Buffer(res.data),
        ContentType: "image/jpeg",
      };
      s3.upload(params, function (err, data) {
        if (err) {
          console.log("ERROR Uploading S3");
          console.log(err, data);
          throw err;
        }
      }).promise();
      return {
        statusCode: 200,
        headers: util.getResponseHeaders(),
        body: JSON.stringify(Buffer(res.data)),
      };
    } catch (err) {
      console.log("ERROR: " + err);
      return {
        statusCode: err.statusCode ? err.statusCode : 500,
        headers: util.getResponseHeaders(),
        body: JSON.stringify({
          error: err.name ? err.name : "Exception",
          message: err.message ? err.message : "Unknown Error",
        }),
      };
    }
  });


【问题讨论】:

  • 您是否尝试过使用预签名 URL 立即将图像文件上传到 S3?它可能会完全规避这个问题。更多信息:docs.aws.amazon.com/AmazonS3/latest/userguide/…
  • @stijndepestel 没试过,但会调查一下!谢谢!
  • 您可以尝试上传相同的文件并下载,看看问题是否仍然存在,您可以上传另一个文件并查看行为吗?这只是为了确保它不是一次性问题
  • 此外,在分段上传中,上传失败的可能性较小。您是否在日志中观察到任何故障?

标签: amazon-web-services amazon-s3 aws-lambda aws-api-gateway serverless-framework


【解决方案1】:

如果您想使用 JavaScript(从 Lambda 函数中)将图像上传到 Amazon S3 存储桶,请尝试使用适用于 JavaScript 的 AWS 开发工具包,而不是发布到 AWS API Gateway。有关如何使用适用于 JavaScript 的 AWS 开发工具包将文件放入 Amazon S3 存储桶的信息,请参阅Uploading photos to Amazon S3 from a browser

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 2023-04-08
    • 2017-11-21
    • 2021-05-21
    • 1970-01-01
    • 2020-06-04
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多