在AWS PHP的上传功能中指定Content-Type

时间:2014-02-19 21:01:36

标签: amazon-web-services amazon-s3 aws-php-sdk

我正在将我的代码从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-contenttype',而'Content-Type'的值是默认的'binary / octet-流”。

我也尝试过使用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标头   自动添加,您可以通过传递添加Content-Type标头   操作的ContentType选项。

首先,我正在上传简单的图片,但根据我的S3仪表板,它们被上传为'binary / octet-stream'。关于他们的第二点,我尝试了许多具有'ContentType'的数组组合我不知道为什么它不起作用......

3 个答案:

答案 0 :(得分:11)

最后,这组选项有效:

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

不需要元数据

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

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

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