Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 为什么AWS Lambda不能正确地将图像上传到S3?_Amazon Web Services_Amazon S3_.net Core_Aws Lambda - Fatal编程技术网

Amazon web services 为什么AWS Lambda不能正确地将图像上传到S3?

Amazon web services 为什么AWS Lambda不能正确地将图像上传到S3?,amazon-web-services,amazon-s3,.net-core,aws-lambda,Amazon Web Services,Amazon S3,.net Core,Aws Lambda,关于使用AWS SDK将图像文件上载到S3,我与.NET Core 2.0 framework有一个问题 当我发布到在本地IIES上运行的端点时,它工作得非常好,我可以在S3中看到生成的文件,没有任何问题 问题如下: 将无服务器部署到AWS Lambda后,在本地环境中产生完美结果的同一个.NET核心端点在Lambda上运行时的行为方式不同 我有理由怀疑这不是角色、策略或任何其他与权限相关的问题 为什么??首先,Lambda确实将文件上传到S3,它可以读取、列出并将对象放入bucket中,而不会

关于使用AWS SDK将图像文件上载到S3,我与.NET Core 2.0 framework有一个问题

当我发布到在本地IIES上运行的端点时,它工作得非常好,我可以在S3中看到生成的文件,没有任何问题

问题如下: 将无服务器部署到AWS Lambda后,在本地环境中产生完美结果的同一个.NET核心端点在Lambda上运行时的行为方式不同

我有理由怀疑这不是角色、策略或任何其他与权限相关的问题

为什么??首先,Lambda确实将文件上传到S3,它可以读取、列出并将对象放入bucket中,而不会出现任何问题

“那有什么问题?”你可能会想。 问题是上传的图片几乎是原始图片的两倍大,提交后字节和内容完全改变。甚至神奇的数字字节也会发生变化,我指的是文件开头表示文件类型的字节

结果是:

第一个是我在本地上传的,第二个是Lambda上传的图片。是的,它们是同一幅画

本地主机:

拉姆达: 如果有帮助,下面是实现S3SDK的C代码:

试试看
{
var region=RegionEndpoint.GetBySystemName(s3Config.region);
_s3Client=新AmazonS3Client(地区);
var fileTransferUtility=新的TransferUtility(_s3Client);
使用(var memoryStream=new memoryStream())
{
image.CopyTo(memoryStream);
var fileTransferUtilityRequest=新的TransferUtilityUploadRequest
{
InputStream=memoryStream,
Key=fileName,
BucketName=s3Config.BucketName,
CannedACL=S3CannedACL.BUCKETOWNERFULL控制,
ContentType=image.ContentType
};
等待fileTransferUtility.UploadAsync(fileTransferUtilityRequest);
var link=“http://{0}.s3-{1}.amazonaws.com”.FormatWith(s3Config.BucketName,s3Config.Region);
返回ResponseMessages.DocumentUpload(文件名、链接);
}
}
其中“image”是一个文件变量。
如果有任何其他信息,我可以提供,以调试这个请让我知道。谢谢。

我最终使用SES和SNS实时调试lambda。 我必须将IFormFile对象序列化为字符串,并在每次上传图像时通过电子邮件发送给自己。我还设置了一个长度为文件长度的SMS

以防万一这对将来的其他人有帮助;请求一经处理,额外的字节就已经存在了。我的意思是,29.7KiB文件在端点执行的第一个瞬间输出了53000字节的
.Length
,因此这不是Lambda问题(可能是我们的API网关或.NET核心的配置)

无论如何,我们通过将base64字符串作为
application/json
属性并按如下方式解码来修复它:

var-imageParts=base64Image.Split(',').ToList();
var buffer=Convert.FromBase64String(imageParts[1]);
wait memoryStream.WriteAsync(buffer,0,buffer.Length);
var fileTransferUtilityRequest=新的TransferUtilityUploadRequest
{
InputStream=memoryStream,
Key=fileName,
BucketName=s3Config.BucketName,
CannedACL=S3CannedACL.BUCKETOWNERFULL控制,
ContentType=“image/{0}”.FormatWith(文件扩展名)
};
等待fileTransferUtility.UploadAsync(fileTransferUtilityRequest);
其中base64Image是base64编码的字符串


如果有人最终出现在我们昨天遇到的同一个地方,只需忽略问题的实际根本原因并使用Base64,它的性能可能不如FormBody中的文件,但肯定会节省一些时间。

很抱歉我错过了这个问题,但长话短说,您需要告诉API网关,您将提供二进制数据作为有效负载

下面是一个示例:

然后,您需要做的唯一一件事是在仅上载到S3时将二进制有效负载转换为base64(这不是问题,因为您的应用程序接收到二进制有效负载,从而节省了有效负载大小)

我已经创建了一个NodeJS示例,所以您只需要相应地将其修改为C#:


我可能会迟到一点,但希望这能让您了解问题所在。

我在通过AWS APIGateway上传图像时遇到了很多问题。我会花点时间看看。如何将文件发布到端点?通过multipart/formdata,如json中的base64?它作为表单数据的一部分发布,ifformfile Image{get;set;}字节和文件大小的更改通常是编码问题的症状。这两个对象在s3上是否具有正确的
内容类型
内容编码
?@FranRoura我建议您检查Lambda角色设置。它将在您的开发机器上工作,因为您正在使用SDK将图像上载到S3。但在Lambda情况下,您的it需要单独的S3完全权限。关联角色应具有访问S3 bucket的完全权限。代码对我来说似乎没问题,它应该在那里工作。请使用cloud watch在您的Lambda中记录跟踪,以了解发生了什么,如果存在权限问题,您可以在跟踪/日志中看到。两年后,每当我遇到编码问题时,我仍然会返回此答案,并且忘记这是因为API网关设置。很抱歉之前没有将其标记为正确答案,我现在已修复:)哈哈。我很高兴它仍然帮助你!感谢您将其标记为正确答案
const upload = body => {
    const id = uuid();
    return new Promise((res, rej) => {
        s3.putObject({
            Bucket: BUCKET,
            Key: id + '.jpg',
            Body: new Buffer(body.replace(/^data:image\/\w+;base64,/, ""),'base64'),
            ContentEncoding: 'base64',
            ContentType: 'image/jpeg'
        }, (err) => {
            if (err) {
                return rej(err);
            }
            return res({
                bucket: BUCKET,
                key: id + '.jpg'
            });
        });
    });
}