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

Nat*_*n H 4 amazon-s3 amazon-web-services aws-php-sdk

我正在将我的代码从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,
                    )
                );
Run Code Online (Sandbox Code Playgroud)

这是我的新版本:

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

我试过的ContentType不同的拼法,在S3网站修改它的名字看起来像"X-AMZ-元的contentType",而"的ContentType"的值是默认的"二进制/八位字节流".

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

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

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

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

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

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

Nat*_*n H 12

最后,这组选项有效:

array('params' => array('ContentType' => $mime))
Run Code Online (Sandbox Code Playgroud)

不需要元数据


Rya*_*man 4

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

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

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

  • 我个人使用“finfo(FILEINFO_MIME_TYPE)”来检测 mime 类型,并将其传递给 AWS SDK。工作正常,直到我切换到新的 SDK。 (3认同)