使用 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 for Java 调用 AWS Lambda 函数时如何检索 context.done() 消息?