使用AWS SDK for PHP上传的Amazon S3文件始终为“;应用程序/八位字节流”;?

使用AWS SDK for PHP上传的Amazon S3文件始终为“;应用程序/八位字节流”;?,php,amazon-s3,amazon-web-services,Php,Amazon S3,Amazon Web Services,根据,contentType是可选的,它将根据文件扩展名尝试确定正确的mime类型。然而,它似乎从不猜测mime类型,并且总是默认为应用程序/八位字节流 这是我的密码: $s3 = new AmazonS3(); $opt = array( 'fileUpload' => $_FILES['file']['tmp_name'], 'storage' => Amazons3::STORAGE_REDUCED); $r = $s3

根据,contentType是可选的,它将根据文件扩展名尝试确定正确的mime类型。然而,它似乎从不猜测mime类型,并且总是默认为应用程序/八位字节流

这是我的密码:

$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上传),然后使用控制台再次上传,则设置了正确的内容类型(例如:gif文件的image/gif,而不是application/octet stream)

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

$s3->create_object('MY_BUCKET', 'xml_file.xml', array(
                                        'body' => '<xml>Valid xml content</xml>',
                                        'contentType' => 'text/xml'
                                    ));
$s3->创建对象('MY\u BUCKET','xml\u file.xml',数组(
“正文”=>“有效的xml内容”,
“contentType”=>“text/xml”
));

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

我刚刚遇到了这样的情况,在上载一些文件时,没有自动检测到内容类型。我无法找出原因是什么,直到我仔细查看SDK执行的代码。我发现用于自动确定内容类型的CFMimeTypes::get_mimetype()函数使用区分大小写的比较来确定MIME类型。因此,只能匹配小写扩展名。如果您的文件扩展名是大写或混合大小写,则它将不匹配并退回到“应用程序/八位字节流”MIME类型

要修复或更改行,请执行以下操作:

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


我使用的是sdkv1.5.8.2,但在过去一周发布的1.5.9或1.5.10版本中,这一检测似乎没有任何变化。我认为这是一个bug,并将其归档。

是的,我总是可以设置内容类型,但事实是,文档说它是自动完成的:如果一个文件正在通过FieluPoad作为文件系统路径上载,它将试图根据文件扩展名来确定正确的MIME类型。但这并没有发生,所以可能有一个bug。
ContentType
大写
C
。否则它对我就不起作用了。在我迁移到新的SDK之前,上面的答案一直对我起作用。我无法让它继续工作:自动MIME类型检测已经在SDK版本1.5.15中修复。
'fileUpload'    => strtolower( $_FILES['file']['tmp_name'] )