gpt4 book ai didi

php - UploadedFile 的文件上传 mime 类型问题

转载 作者:行者123 更新时间:2023-12-04 00:43:06 29 4
gpt4 key购买 nike

我在 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());
}

PHP单元测试代码

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(在 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() 和系统二进制"file"(按此顺序),具体取决于其中哪些可用。

谢谢大家的帮助:D

关于php - UploadedFile 的文件上传 mime 类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26926319/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com