当前位置: 首页 > 知识库问答 >
问题:

文件上载mime类型有UploadedFile问题

姚文轩
2023-03-14

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

file --mime-type /home/mysuer/img.png

它给了我这个:

home/myuser/img.png: image/png
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"

共有1个答案

黄俊智
2023-03-14

最后,我得到了我的问题的解决方案,也将在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()中,使用MimeTypeGuesser实例猜测mime类型,该实例使用finfo()Mime_content_type()和系统二进制“文件”(按此顺序),具体取决于哪一个可用。

感谢大家的帮助

 类似资料:
  • 问题内容: 我正在开发一个简单的php上传脚本,用户只能上传ZIP和RAR文件。 我应该使用哪些MIME类型检查?(请提供完整清单) 谢谢.. 问题答案: 来自freedompeace,Kiyarash和Sam Vloeberghs的答案: 我也会检查文件名。这是检查文件是RAR还是ZIP文件的方法。我通过创建一个快速的命令行应用程序对其进行了测试。 请注意,它仍然不能100%确定,但是可能已经足

  • 我正在尝试使用共享意图共享一个文件。如果我将“text/平原”设置为mime类型,它会像文本而不是文本文件一样读取内容,那么共享菜单中给出的选项是Whatsapp、Line等。 有人知道如何配置共享意图,使共享选项仅是能够发送<代码>的程序吗。txt文件(Gmail、Dropbox等,但不是Whatsapp等)?谢谢

  • 我创建了一个Cordova应用程序,在创建一个新项目时,它只提供默认的Angular欢迎页面。它在浏览器中运行良好。当通过Android Studio在模拟器上运行时,它运行良好。 当我在android设备上运行它时,会得到一个空白页面,控制台中会出现以下错误: 我可以通过编辑dist来修复此问题/ 如果我将其更改为,应用程序将在我的设备上正确运行。 如何告诉Cordova在提供javascrip

  • MIME(多用途Internet邮件扩展)类型告诉浏览器如何处理某些类型的文件。 当文件发送到您网站访问者的浏览器时,它也会发送该文件的MIME类型。 MIME类型告诉浏览器文件类型以及如何将文件提供给用户。 例如,如果将.js文件发送到浏览器,则还会发送application/JavaScript MIME类型以告知浏览器.js文件是JavaScript文件,浏览器会相应地处理该文件。 大多数M

  • 我正在使用vaadin(7.1.9)的upload组件,现在我的问题是我无法限制哪种文件可以与upload组件一起发送到服务器,但我没有找到任何用于此目的的API。唯一的方法是丢弃错误类型的文件后上传。 这是一种正确的方式吗?

  • 本文向大家介绍Yii2实现UploadedFile上传文件示例,包括了Yii2实现UploadedFile上传文件示例的使用技巧和注意事项,需要的朋友参考一下 闲来无事,整理了一下自己写的文件上传类。 通过 把表单上传的文件赋值到  UploadedFile中的  private static $_files  中 loadFiles()方法,把$_FILES中的键值作为参数传递到loadFile