Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php UploadedFile的文件上载mime类型问题_Php_Symfony_File Upload_Mime Types_Is Uploaded File - Fatal编程技术网

Php UploadedFile的文件上载mime类型问题

Php UploadedFile的文件上载mime类型问题,php,symfony,file-upload,mime-types,is-uploaded-file,Php,Symfony,File Upload,Mime Types,Is Uploaded File,我正在使用symfony2中的UploadedFile类上载图像文件。我允许使用mime类型image/jpg和image/png的图像。当我将png文件从系统上传到服务器时,它的mime类型会自动更改。我知道它已更改,因为当我发出此命令时: file --mime-type /home/mysuer/img.png 它给了我这个: home/myuser/img.png: image/png 但当我上传文件并打印UploadedFile对象时,它会给出以下输出: Array ( [

我正在使用symfony2中的
UploadedFile
类上载图像文件。我允许使用mime类型
image/jpg
image/png
的图像。当我将png文件从系统上传到服务器时,它的mime类型会自动更改。我知道它已更改,因为当我发出此命令时:

file --mime-type /home/mysuer/img.png
它给了我这个:

home/myuser/img.png: image/png
但当我上传文件并打印
UploadedFile
对象时,它会给出以下输出:

Array
(
    [media] => Symfony\Component\HttpFoundation\File\UploadedFile Object
        (
            [test:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 
            [originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => img.png
            [mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => application/octet-stream
            [size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 1246
            [error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0
            [pathName:SplFileInfo:private] => /tmp/phpivgnne
            [fileName:SplFileInfo:private] => phpivgnne
        )

)
有人能告诉我出了什么事吗

编辑 这是我的密码:

public function postFileAction(Request $request)
{
    print_r($request->files->all());//Prints All files


    $image = $request->files->get('media');
    echo $image->getClientMimeType();exit; //Mime Type Information

    if (empty($image)) {
        throw new FileException('Invalid File, Please Select a Valid File.');
    }

    $uploader = $this->get('application.file_uploader');

    if (!$this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) {
        //authenticated (NON anonymous users)
        throw new InvalidParameterException('Invalid User, Please use valid credentials');
    }

    return $uploader->upload($image, $this->get('security.context')->getToken()->getUser()->getId());
}
PHPUnit测试代码

public function testPostFile()
{
    $file    = tempnam(sys_get_temp_dir(), 'upl'); // create file
    imagepng(imagecreatetruecolor(10, 10), $file); // create and write image/png to it
    $image   = new UploadedFile($file, 'new_image.png', 'image/png', 10, UPLOAD_ERR_OK);
    $crawler = $this->client->request(
            'POST', '/api/v1/files.json', array('submit' => 'Submit Form'), array('media' => $image)
    );

    $response = $this->client->getResponse();

    $this->assertJsonResponse($response);
    $this->assertContains('filename', $response->getContent());

    print_r($response->getContent());exit;

    $fileToken = json_decode($response->getContent());
    $this->assertNotEmpty($fileToken->filename);

    unlink($file);
    unset($file, $image, $crawler, $response);

    return $fileToken->filename;
}
我正在命令提示符下使用
curl
测试REST web服务文件上载,如下所示:

curl -X POST myapi.com/app_dev.php/api/v1/files.json --form "media=@/home/myuser/img.png"

最后,我得到了我的问题的解决方案,并将在core php和symfony2中发布问题的答案

核心PHP(可在上找到):

// DO NOT TRUST $_FILES['upfile']['mime'] VALUE !!
// Check MIME Type by yourself.
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (false === $ext = array_search(
    $finfo->file($_FILES['upfile']['tmp_name']),
    array(
        'jpg' => 'image/jpeg',
        'png' => 'image/png',
        'gif' => 'image/gif',
    ),
    true
)) {
    throw new RuntimeException('Invalid file format.');
}
所以永远不要相信
$\u文件['upfile']['mime']
总是使用
fileinfo
,这给了我线索

对于Symfony2:

// DO NOT TRUST $_FILES['upfile']['mime'] VALUE !!
// Check MIME Type by yourself.
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (false === $ext = array_search(
    $finfo->file($_FILES['upfile']['tmp_name']),
    array(
        'jpg' => 'image/jpeg',
        'png' => 'image/png',
        'gif' => 'image/gif',
    ),
    true
)) {
    throw new RuntimeException('Invalid file format.');
}
因此,我开始研究我的代码,发现我使用的是
$file->getClientMimeType()
,这不太好,我们必须使用
$file->getMimeType()
,它使用
fileinfo
获取mime类型,并将给出正确的mime类型

getMimeType()
中,使用
MimeTypeGuesser
实例猜测mime类型,该实例使用
finfo()
mime\u content\u type()
和系统二进制“文件”(按此顺序),具体取决于哪些文件可用


谢谢大家的帮助:D

也许你应该在这里检查文件的扩展名而不是MIME类型。如果有人上传扩展名为.png的exe怎么办?我不想使用扩展,我只想使用mime类型。这是一种奇怪的行为,我从来没有遇到过使用phpIt上传文件的问题,因为请求内容类型头可能会出现这种情况。文件可能以应用程序/八位字节流的形式发送,因此Symfony会根据头正确定义其mime类型。如果其头应该添加头内容类型,我有什么建议吗?上传图像时我应该添加头内容类型:image/png我找到了关于android mime类型的堆栈答案:。我再也帮不了你了对不起…也谢谢你,你帮了我很多,把我送到了正确的方向:D@PerroinThibault