Ash*_*thi 2 php file-upload symfony mime-types is-uploaded-file
我UploadedFile在symfony2中使用类来上传图像文件.我已经允许MIME类型的图像image/jpg和image/png.当我将png文件从我的系统上传到服务器时,其mime类型会自动更改.我知道它改变了,因为当我发出这个命令:
file --mime-type /home/mysuer/img.png
Run Code Online (Sandbox Code Playgroud)
它给了我这个:
home/myuser/img.png: image/png
Run Code Online (Sandbox Code Playgroud)
但是当我上传文件和打印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
)
)
Run Code Online (Sandbox Code Playgroud)
任何人都可以说明什么是错的?
这是我的代码:
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());
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用curl命令提示符来测试我的REST Web服务文件上传,如下所示:
curl -X POST myapi.com/app_dev.php/api/v1/files.json --form "media=@/home/myuser/img.png"
Run Code Online (Sandbox Code Playgroud)
最后我得到了我的问题的解决方案将发布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.');
}
Run Code Online (Sandbox Code Playgroud)
所以永远不要相信$_FILES['upfile']['mime']总是使用fileinfo,这给了我线索.
对于Symfony2:
所以我开始查看我的代码并发现我正在使用$file->getClientMimeType(),这不是很好,我们必须使用$file->getMimeType()哪些用于fileinfo获取mime类型并将提供正确的mime类型.
在getMimeType()MIME类型是使用猜到MimeTypeGuesser实例,它使用finfo(),mime_content_type()并且该系统二进制"文件"(按此次序),这取决于哪个那些是可用的.
谢谢大家的帮助:D
| 归档时间: |
|
| 查看次数: |
8139 次 |
| 最近记录: |