我正在将图像保存到我的 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 为您提供帮助...
尝试在 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
如果您遇到此问题,您应该尝试通过 S3 存储桶(而不是本地存储的版本)在 macOS 上的 Safari 中打开图像。如果它有效,你可能会遇到我的情况,文件上传不允许 .heic 文件(我认为是 iPhone 相机胶卷上的默认文件),由于网站文件上传程序的限制,导致用户可能简单地将 .heic 更改为 .jpg。遗憾的是,这实际上并没有将文件从 HEIF 转换为 JPG。
在 macOS 终端上,您还可以通过以下方式检查实际文件类型:
file my-jpg-file-that-is-actually-heic.jpg
另请注意,在 S3 存储桶对象上的 AWS 控制台中,您可以更改 所以发生的情况是:网站很愚蠢,禁止 .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()。