我一直在尝试在 Laravel 5 中上传图像(通过 laravelcollective/forms 生成的上传,并使用干预图像库进行处理)。我想做的是当用户上传任何照片时,我想根据它的 mimetype 设置扩展。应该有一些基本的检查来防止虚假数据注入。
$file_profile_image->getClientMimeType();
为此,我应该像这样简单地映射吗?
['image/jpeg' => 'jpg', 'image/gif'=> 'gif']
我一直在尝试在 Laravel 5 中上传图像(通过 laravelcollective/forms 生成的上传,并使用干预图像库进行处理)。我想做的是当用户上传任何照片时,我想根据它的 mimetype 设置扩展。应该有一些基本的检查来防止虚假数据注入。
$file_profile_image->getClientMimeType();
为此,我应该像这样简单地映射吗?
['image/jpeg' => 'jpg', 'image/gif'=> 'gif']
我会使用 Intervention 包来检查您是否正在加载有效的图像并从那里获取 mime。
像这样的东西:
/**
* Store a file
*
* @return Response
*/
public function store(Filesystem $filesystem)
{
// check if file was posted
$uploadedFile = Request::file('file');
// other checks here, ->isValid() && filesize
try {
$image = Image::make(\File::get($uploadedFile));
} catch (\Intervention\Image\Exception\NotReadableException $e) {
\Log::error('Unsupported filetype');
dd('Unsupported filetype');
// return proper error here
}
// mime as returned by Intervention
$mime = $image->mime();
// other stuff
// store @ fs
}
我会这样做:
$source_file = $request->file('image')->getRealPath();
$info = get_image_details($source_file);
该get_image_details($path)
函数可以定义如下:
function get_image_details($path)
{
$details = @getimagesize( $path );
if ( is_array($details) && count($details) > 2 ) {
$info = [
'width' => $details[0],
'height' => $details[1],
'mime' => $details['mime'],
'size' => @filesize($path),
'path' => $path,
];
switch ($details['2']) {
case IMG_PNG:
case 3:
$info['type'] = 'png';
break;
case IMG_JPG:
case 2:
$info['type'] = 'jpg';
break;
case IMG_GIF:
case 1:
$info['type'] = 'gif';
break;
default:
$info['type'] = $details[2];
break;
}
return $info;
}
return false;
}
文件对象有一个专门用于这种情况的方法。您所要做的就是guessExtension
像这样调用文件对象上的方法
$file_profile_image->guessExtension()