根据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控制台的屏幕截图:
如何在不设置contentType选项的情况下实际自动设置正确的内容类型,或者您是否真的需要手动设置?
其他信息:如果我从控制台下载文件(我最初通过SDK上传),然后使用控制台再次上传,则设置正确的Content-Type(例如:图像/ gif用于GIF文件而不是应用程序/八位字节流)
答案 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版本中,这种检测没有任何变化。我认为这是一个错误,并将提交它。