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

时间:2012-02-07 19:36:27

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

根据docs contentType 是可选的,将尝试根据文件扩展名确定正确的mime类型。但是,它似乎永远不会猜测mime类型并始终默认为 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控制台的屏幕截图:

enter image description here

如何在不设置contentType选项的情况下实际自动设置正确的内容类型,或者您是否真的需要手动设置?

其他信息:如果我从控制台下载文件(我最初通过SDK上传),然后使用控制台再次上传,则设置正确的Content-Type(例如:图像/ gif用于GIF文件而不是应用程序/八位字节流)

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

我刚遇到这种情况,在上传某些文件时,没有自动检测到Content-Type。在看完SDK执行的代码之前,我无法弄清楚原因是什么。我发现CFMimeTypes :: get_mimetype()函数用于自动确定Content-Type,它使用区分大小写的比较来确定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版本中,这种检测没有任何变化。我认为这是一个错误,并将提交它。