使用 AWS SDK for PHP 上传的 Amazon S3 文件总是“application/octet-stream”?

Posted

技术标签:

【中文标题】使用 AWS SDK for PHP 上传的 Amazon S3 文件总是“application/octet-stream”?【英文标题】:Amazon S3 files uploaded using AWS SDK for PHP is always “application/octet-stream”? 【发布时间】:2012-02-29 06:13:04 【问题描述】:

根据docs,contentType 是可选的,它将尝试根据文件扩展名确定正确的 mime 类型。但是,它似乎从未猜到 mime-type 并且始终默认为 application/octet-stream

这是我的代码:

$s3 = new AmazonS3();

$opt = array(   'fileUpload'    => $_FILES['file']['tmp_name'],
                'storage'       => Amazons3::STORAGE_REDUCED);

$r = $s3->create_object('mybucket', $_FILES['file']['name'], $opt);

这是我的 AWS 控制台的屏幕截图:

如何在不设置 contentType 选项的情况下实际自动设置正确的内容类型,还是真的必须手动设置?

附加信息:如果我从控制台下载一个文件(我最初通过 SDK 上传的文件)然后使用控制台再次上传,则会设置正确的 Content-Type(例如:GIF 文件的 image/gif 而不是 application/字节流)

【问题讨论】:

【参考方案1】:

我刚刚遇到这种情况,在上传一些文件时,没有自动检测到 Content-Type。在我单步执行代码查看 SDK 执行之前,我无法弄清楚原因是什么。我发现用于自动确定 Content-Type 的 CFMimeTypes::get_mimetype() 函数使用区分大小写的比较来确定 MIME 类型。因此,只有小写扩展名会匹配。如果您的文件扩展名是大写或混合大小写,则它将不匹配并回退到“application/octet-stream”MIME 类型。

修正换行:

'fileUpload'    => $_FILES['file']['tmp_name']

'fileUpload'    => strtolower( $_FILES['file']['tmp_name'] )

我使用的是 SDK v 1.5.8.2,但在过去一周发布的 1.5.9 或 1.5.10 版本中,此检测似乎没有任何变化。我认为这是一个错误,并将按此提交。

【讨论】:

SDK 1.5.15 版本已修复自动检测 MIME 类型。【参考方案2】:

在创建对象时尝试将“contentType”键添加到您的选项数组中,并使用“body”而不是“fileUpload”。例如:

$s3->create_object('MY_BUCKET', 'xml_file.xml', array(
                                        'body' => '<xml>Valid xml content</xml>',
                                        'contentType' => 'text/xml'
                                    ));

成功创建文本/xml 内容类型的文件。据我所知,通过 SDK 上传时不会自动设置 Content-Type。但是从 php 端删除 mime 类型并设置 'contentType' 属性的问题在哪里?

【讨论】:

是的,我总是可以设置 contentType 但事实是,文档说它是自动完成的:如果文件通过 fileUpload 作为文件系统路径上传,它将尝试确定根据文件扩展名正确的 mime 类型。 但没有发生,所以可能存在错误。 ContentType 大写为C。否则它对我不起作用。 在我迁移到新的 SDK 之前,上述答案对我有用。我不能让它工作了:***.com/questions/21892352/…

以上是关于使用 AWS SDK for PHP 上传的 Amazon S3 文件总是“application/octet-stream”?的主要内容,如果未能解决你的问题,请参考以下文章

通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问

通过 AWS SDK for Go 在 Device Farm 中上传的 Android 应用程序从未从 INITIALIZED 更改状态

如何使用 aws-sdk 将文件同步上传到 S3?

百度的Ueditor(php)上传到aws s3存储方案

百度的Ueditor(php)上传到aws s3存储方案

使用 AWS SDK for Java 调用 AWS Lambda 函数时如何检索 context.done() 消息?