【发布时间】:2015-01-11 15:03:55
【问题描述】:
我在 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"
【问题讨论】:
-
也许你应该在这里检查文件的扩展名而不是 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