我尝试使用Image Magick在Laravel上传,转换和存储图像。
内部App\Http\Controllers\ArticleController
:
$image = $this->storeMainImage($request->file('thumbnail'));
功能:
private function storeMainImage($file) {
$folder = 'uploads/images/'; <--- ?????
$code = uniqid();
$thumb_code = $folder . 'thumb_' . $code . '.jpg';
$image_code = $folder . $code . '.jpg';
if(@is_array(getimagesize($file))){
exec('convert '.$file.' -thumbnail 225x225^ -gravity center -extent 225x225 -compress JPEG -quality 70 -background fill white -layers flatten -strip -unsharp 0.5x0.5+0.5+0.008 '.$thumb_code);
exec('convert '.$file.' -compress JPEG -quality 70 -background fill white -layers flatten -strip -unsharp 0.5x0.5+0.5+0.008 '.$image_code);
return $image_code;
} else {
return false;
}
}
我没有遇到任何错误,但我不知道它是否实际上传了该文件以及它存储的位置。
答案 0 :(得分:1)
$ request-&gt; file()可以返回: \ Symfony \ Component \ HttpFoundation \ File \ UploadedFile 或数组或空强>
您应该在处理之前检查它。只需使用 var_dump($ file)或 dd($ file)转储它。不确定,但它不应该是字符串。
对$ folder变量使用 public_path(),它可以帮助您防止将来出现任何问题。
还要检查Laravel的这个很棒的包:http://image.intervention.io/getting_started/introduction
答案 1 :(得分:0)
要使用Image Magick,首先必须确保您的服务器是否具有该模块。否则你可以安装它。 See this to install imagemagick
否则,您可以通过在配置文件夹中配置image.php
文件来使用gd。 gd默认可用
由于$folder = 'uploads/images/'; <--- ?????
没有指定起始点,因此起点将是您运行脚本时的位置。因此,为了确保存储路径,如果分别存储在storage_path()
或public_path()
文件夹中,则应使用storage
或public
来定义路径。 Check here for more paths available根据您使用的版本。鉴于链接适用于Laravel 5.2。您可以更改页面右上角的版本。
答案 2 :(得分:0)
我制作了一个脚本,支持在使用Image Intervention包的Laravel中上传多个图像/文件。这可能对你和其他人有用。我添加了一些评论并删除了不必要的代码,以便更好地了解正在发生的事情。
HTML标记
<form method="post" action="{{ route('admin.upload.store') }}" enctype="multipart/form-data">
{{!! csrf_field() !!}}
<input type="file" name="files[]" accept="image/gif, image/jpeg, image/png">
<button type="submit">Upload image(s)</button>
</form>
<强> UploadController 强>
使用Laravel的内置RESTful资源控制器路由
/**
* Store a newly created resource in storage.
* Supports uploading multiple files at once.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// Loop through the files array
foreach($request->file('files') as $file) {
// Validate each file, we want images only
$validator = Validator::make(compact('file'), [
'files' => 'mimes:jpeg,bmp,gif,png'
]);
if ($validator->fails()) {
return redirect()->route('admin.upload.index')->withErrors($validator);
}
// Create a new upload model for the file
$upload = new Upload([
'name' => pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME) . '_' . Str::random(2),
'extension' => strtolower($file->getClientOriginalExtension()),
'mimetype' => $file->getMimeType(),
'size' => $file->getSize(),
]);
// Create the image
$file = Image::make($file)->widen(1200, function($constraint) {
$constraint->upsize(); // Prevent upsizing the image if doesn't exceed the maximum width
})->encode($upload->extension);
// Store it within 'storage/app/uploads'
Storage::disk('uploads')->put($upload->fullName(), $file);
// Save the upload file details in the database
$upload->save();
}
return redirect()->route('admin.upload.index')->with(['success' => 'Files uploaded']);
}