使用Laravel 5存储上传的图像

时间:2016-05-29 07:46:07

标签: php laravel laravel-5

我尝试使用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;
  }
}

我没有遇到任何错误,但我不知道它是否实际上传了该文件以及它存储的位置。

3 个答案:

答案 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()文件夹中,则应使用storagepublic来定义路径。 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']);
}