6

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

我有一个图片上传器。在我以前的版本中,我会像这样指定图像的 Content-Type:

$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-contenttype”,而“Content-Type”的值是默认的“二进制/八位字节流”。

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

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

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

编辑:我在文档中的某处看到:

适用于 PHP 的 AWS 开发工具包将尝试自动确定用于存储对象的最合适的 Content-Type 标头。如果您使用的是不太常见的文件扩展名并且没有自动添加 Content-Type 标头,则可以通过将 ContentType 选项传递给操作来添加 Content-Type 标头。

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

4

3 回答 3

16

最后,这组选项起作用了:

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

不需要元数据

于 2014-02-21T06:21:56.600 回答
4
  1. 好吧,直接使用AWS\S3\S3Client::putObject()肯定会为您提供所需的控制。

  2. 文件扩展名必须为小写才能使自动检测起作用。

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

于 2014-02-20T09:40:23.633 回答
2

我相信较新的 AWS API 版本要求直接设置内容类型,例如

$client->putObject([
       'Bucket'      => $sBucket,
       'Key'         => $sPath,
       'SourceFile'  => $sData,
       'ContentType' => $sMimeType]);
于 2021-02-18T22:46:33.300 回答