【问题标题】:file upload mime type issue with UploadedFileUploadedFile 的文件上传 MIME 类型问题
【发布时间】:2015-01-11 15:03:55
【问题描述】:

我在 symfony2 中使用UploadedFile 类来上传图像文件。我允许使用 mime 类型为 image/jpgimage/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"

【问题讨论】:

  • 也许你应该在这里检查文件的扩展名而不是 MIME 类型。
  • 如果有人上传 .png 扩展名的 exe 怎么办?我不想使用扩展程序,我只想使用 mime-type。这是一种奇怪的行为,我从未遇到过使用 php 上传文件的此类问题
  • 这可能是由于请求内容类型标头而发生的。该文件可能作为 application/octet-stream 发送,因此 Symfony 根据 header 正确定义其 mime-type。
  • 任何建议我该如何解决它,如果它的标题我应该添加标题 Content-Type: image/png 同时上传图片
  • 我找到了关于 android 的 mime 类型的堆栈答案:stackoverflow.com/questions/8778151/…。对不起,我帮不了你了……

标签: php symfony file-upload mime-types is-uploaded-file


【解决方案1】:

最后我得到了我的问题的解决方案,我也会在 core-php 和 symfony2 中发布问题的答案。

核心 PHP(发现于 http://php.net/manual/en/features.file-upload.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.');
}

所以永远不要相信$_FILES['upfile']['mime'],总是使用fileinfo,这给了我线索。

对于 Symfony2:

所以我开始查看我的代码,发现我使用的是$file->getClientMimeType(),这不好,我们必须使用$file->getMimeType(),它使用fileinfo 来获取mime 类型,并会给出正确的mime 类型。

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

感谢大家的帮助:D

【讨论】:

  • 也感谢您,感谢您为我提供了很多帮助并让我朝着正确的方向前进:D @PerroinThibault
猜你喜欢
  • 1970-01-01
  • 2017-11-25
  • 2016-03-03
  • 2010-10-16
  • 2011-06-09
  • 2013-10-20
  • 2011-01-25
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多