在 AWS PHP 的上传函数中指定内容类型



我正在将代码从AWS PHP SDK1迁移到SDK2(https://github.com/aws/aws-sdk-php)。

我有一个图片上传器。在我以前的版本中,我会指定我的图像的内容类型,如下所示:

$response = $this->s3->create_object(
$bucket,
$key,
array(
'fileUpload'=>$file_resource,
'contentType'=>$mime, 
'acl' => AmazonS3::ACL_PUBLIC,
)
);

这是我的新版本:

$response = $this->s3->upload(
$bucket, 
$key, 
$file_resource, 
'public-read',
array('params' => array('Metadata' => array('ContentType'=>$mime)))
);

我尝试过ContentType的不同拼写,在S3站点中,它将名称修改为"x-amz-meta-contentype",而"Content Type"的值是默认的"binary/octet stream"。

我也尝试过使用EntityBody功能,但结果相同:

$response = $this->s3->upload(
$this->bucket, 
$to, 
EntityBody::factory($file_resource), 
'public-read',
array('params' => array('Metadata' => array('ContentType'=>$mime)))
);

如何在这个新的API中设置内容类型?

编辑:我在文档中看到:

AWS SDK for PHP将尝试自动确定用于存储对象的适当内容类型标头。如果你是使用不太常见的文件扩展名,而您的"内容类型"标头不是自动添加,可以通过传递操作的ContentType选项。

首先,我正在上传简单的图像,但根据我的S3仪表板,它们被上传为"二进制/八位字节流"。关于他们的第二点,我已经尝试了许多带有"ContentType"的数组组合,我不确定为什么它不起作用。。。

最后,这组选项有效:

array('params' => array('ContentType' => $mime))

无需元数据

  1. 好吧,直接使用AWS\S3\S3Client::putObject()肯定会为您提供所需的控制。

  2. 文件扩展名必须是小写,自动检测才能工作。

  3. 您可以在Guzzle\Http\Mimetypes中找到支持的mime类型列表。

我认为最近的AWS API版本要求直接设置内容类型,例如

$client->putObject([
'Bucket'      => $sBucket,
'Key'         => $sPath,
'SourceFile'  => $sData,
'ContentType' => $sMimeType]);

最新更新