保存的图像“无法显示,因为它包含错误”

问题描述 投票:0回答:2

我正在将图像保存到我的 s3 存储桶,但虽然我看到保存的文件,但无法打开它们。在 Firefox 中,我收到错误“图像无法显示,因为它包含错误”。 此代码在将图像保存到服务器时有效,所以我只是将其更改为相应地保存到存储桶:

$s3 = S3Client::factory(array( 'region' => $region, 'version' => $version )); $bucket = "test"; $file_path = $bucket . "/this/is_working/"; try { $content_type = "image/" . $extension; // Upload a file. $result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $file_path, 'ACL' => 'public-read', 'ContentType' => $content_type, 'Body' => $_FILES['picture']['tmp_name'] ));

正如我所说,我确实看到了名为 .png 的文件,但每当我尝试获取链接时

http://region.amazonaws.com/bucket/file

 它都会失败,并显示“无法显示,因为包含错误”。对这个有什么想法吗? TYVM 为您提供帮助...

php amazon-web-services amazon-s3
2个回答
0
投票
我想如果您现在打开其中一张图像,您会发现它是一个文本文件,其中包含您尝试上传的文件的名称。

尝试在 putObject 调用中使用“SourceFile”而不是“Body”:

$result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $file_path, 'ACL' => 'public-read', 'ContentType' => $content_type, 'SourceFile' => $_FILES['picture']['tmp_name'] ));

或者打开文件并传输内容:

$result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $file_path, 'ACL' => 'public-read', 'ContentType' => $content_type, 'Body' => fopen($_FILES['picture']['tmp_name'], 'r+') ));

SDK 文档提供了更多示例

http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.S3.S3Client.html#_putObject


0
投票
这是“由于包含错误而无法显示”的 Google No1 结果,但我出于不同且棘手的原因遇到了它。

如果您遇到此问题,您应该尝试通过 S3 存储桶(而不是本地存储的版本)在 macOS 上的 Safari 中打开图像。如果它有效,你可能会遇到我的情况,文件上传不允许 .heic 文件(我认为是 iPhone 相机胶卷上的默认文件),由于网站文件上传程序的限制,导致用户可能简单地将 .heic 更改为 .jpg。遗憾的是,这实际上并没有将文件从 HEIF 转换为 JPG。

在 macOS 终端上,您还可以通过以下方式检查实际文件类型:

file my-jpg-file-that-is-actually-heic.jpg

Example file command result of jpg file that is actually heic

另请注意,在 S3 存储桶对象上的 AWS 控制台中,您可以更改

ContentType changed from image/jpg to image/heic

所以发生的情况是:网站很愚蠢,禁止 .heic -> S3 或者你的后端很愚蠢,并根据文件扩展名推断 ContentType -> 然后 firefox/chrome 浏览器很愚蠢,认为图像文件已损坏。

所以基本上你实际上是在问“

如何让 HEIC 图像格式在 s3 中工作

在 S3 PUT 请求上传递 ContentType = "image/heic" 将使 S3 突然变得更加智能。您基本上可以通过原始文件名调用损坏的 .jpg 文件,它将下载为固定的 .heic。

如何实现ContentType猜测而不需要文件扩展名mime类型猜测?我使用的是 C#,似乎有一个名为

Mime-Detective 的 nuget 包我会尝试一下。在 PHP 中,这似乎甚至是一个本机命令 mime_content_type()

© www.soinside.com 2019 - 2024. All rights reserved.