Php 我如何安全地处理没有';结尾没有文件扩展名吗?
我正在构建一个系统,使用Laravel媒体库来存储URL中的图像,而不是上传的图像。在测试中,我使用Php 我如何安全地处理没有';结尾没有文件扩展名吗?,php,laravel,Php,Laravel,我正在构建一个系统,使用Laravel媒体库来存储URL中的图像,而不是上传的图像。在测试中,我使用$faker->imageUrl($width=640,$height=480)生成一个随机url。在控制器上,我有一个helper函数,该函数从图像url获取文件扩展名,以帮助创建要存储的文件名: 助手 function getFileExtensionFromImgPath($image_path) { $typeString = null; $typeInt = exif
$faker->imageUrl($width=640,$height=480)
生成一个随机url。在控制器上,我有一个helper函数,该函数从图像url获取文件扩展名,以帮助创建要存储的文件名:
助手
function getFileExtensionFromImgPath($image_path)
{
$typeString = null;
$typeInt = exif_imagetype($image_path);
//dd($typeInt);
switch($typeInt) {
case IMG_GIF:
$typeString = 'gif';
break;
case IMG_JPG:
$typeString = 'jpg';
break;
case IMAGETYPE_JPEG:
$typeString = 'jpeg';
break;
case IMAGETYPE_PNG:
$typeString = 'png';
break;
case IMG_WBMP:
$typeString = 'wbmp';
break;
case IMG_XPM:
$typeString = 'xpm';
break;
default:
$typeString = 'unknown';
}
return $typeString;
}
控制器方法
public function store(Request $request)
{
$imgPath = $request->input('img_path');
if (!empty($imgPath)) {
//Create filename
$filename = time() . '_' . $post->slug . "." . getFileExtensionFromImgPath($imgPath);
dd($filename);
// Store in Laravel media manager
$post->addMediaFromUrl($imgPath)->usingFileName($filename)->toMediaCollection('post_thumbnail');
}
//dd($post->getFirstMedia('post_thumbnail')->getPath());
return new PostResource($post);
}
我一直遇到的问题是,$faker->imageUrl($width=640,$height=480)
没有生成带有扩展名(如JPG或PNG:http://lorempixel.com/800/400/cats/Faker/
在测试过程中会给我一个
ErrorException:exif_imagetype():读取错误
如何安全地处理结尾没有文件扩展名的图像url提交
编辑
我正在寻找帮助函数的帮助,以确定没有文件扩展名的链接是否是图像。当我将通过请求传递的图像设置为具有类似jpg、png的文件扩展名时,测试成功。我试图找出一个url链接没有文件扩展名的用例 首先,您需要弄清楚您的用户是要传递现有图像的URL,还是要实际上传文件,您的控制器代码让我相信后者 我认为您的控制器代码可能很好,这实际上是您的测试设置需要工作,目前您正在将URL传递给控制器,然后尝试将其视为实际文件,但在生产中,它实际上会收到一个实际文件,该文件将是light/Http/UploadedFile的实例 因此,在测试中,您应该使用
UploadedFile::fake()->image('avatar.jpg')
而不是$faker->imageUrl($width=640,$height=480)
您可以更改文件扩展名以满足您的需要,或者类似于UploadedFile::fake()->image($faker->randomElement(['avatar.jpg'、'avatar.png'、'avatar.gif'、'avatar.bmp',])之类的内容。
以下是关于测试文件上传的完整Laravel文档:
除非您知道
lorempixel.com
总是返回JPEG,否则唯一的方法是下载图像并分析格式(例如,使用POSIX文件
命令,或ImageMagick标识
命令,或通过PHP扩展等效).你能给我举一个使用Imagick::identifyImage
的例子吗。我尝试了$image=newimagick($real\u location);dd($图像)代码>我刚刚收到一封500美元的信,谢谢你的回答。对不起,我应该更清楚的图像URL的将提交的链接,而不是上传。当我使用类似于avatar.jpg
的东西时,测试成功了,但问题是图像的链接可能没有扩展就提交了。再次谢谢你,我很困惑。我读错了吗?或者您希望支持两种情况,即可以上载真实图像或现有图像的URL?或者你只想处理图像URL?对不起,我一定说错了。我只是支持从web上获取现有图像的URL。