PHP Laravel 框架上传图片表单处理

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21069903/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 08:51:58  来源:igfitidea点击:

PHP Laravel Framework Uploading Image Form Processing

phpformsvalidationlaravellaravel-4

提问by Mitch

I'm trying to learn to an process image form that uploads images to a database and lets users view the image on the website, this is done using Laravel 4. I must have some sort of bug, because the view doesn't have any errors, but when I select an image to upload and hit the "save" button on my form, nothing happens other than it looks like the form has been refreshed because the file is gone.

我正在尝试学习一种将图像上传到数据库并让用户在网站上查看图像的处理图像表单,这是使用 Laravel 4 完成的。我必须有某种错误,因为视图没有任何错误错误,但是当我选择要上传的图像并点击表单上的“保存”按钮时,除了看起来表单因文件消失而刷新之外,没有任何反应。

Routes

路线

// This is for the get event of the index page
Route::get('/', array(
    'as' => 'index_page',
    'uses' => 'ImageController@getIndex'
));

// This is for the post event of the index page
Route::post('/', array(
    'as' => 'index_page_post',
    'before' => 'csrf',
    'uses' => 'ImageController@postIndex'
));

ImageController.php

图像控制器.php

class ImageController extends BaseController {

public function getIndex()
{
    // Let's first load the form view
    return View::make('tpl.index');
}

public function postIndex()
{
    // Let's validate the form first with the rules which are set at the model
    $input = Input::all();
    $rules = Photo::$upload_rules;

    $validation = Validator::make($input, $rules);

    // If the validation fails, we redirect the user to the index page, with errors

    if ($validation->passes()) {
        // If the validation passes, we upload the image to the database and process it
        $image = Input::file('image');

        // This is the original uploaded client name of the image
        $filename = $image->getClientOriginalName();
        // Because Symfony API does not provide filename
        // without extension, we will be using raw PHP here

        $filename = pathinfo($filename, PATHINFO_FILENAME);

        // We should salt and make an url-friendly version of the file
        $fullname = Str::slug(Str::random(8) . $filename) . '.' .
            $image->getClientOriginalExtension();

        // We upload the image first to the upload folder, then
        // get make a thumbnail from the uploaded image
        $upload = $image->move
            (Config::get('image.upload_folder'), $fullname);

        Image::make(Config::get('image.thumb_folder').'/'.$fullname)
            ->resize(Config::get('image.thumb_width'), null, true)
            ->save(Config::get('image.thumb_folder').'/'.$fullname);

        // If the file is now uploaded we show a success message
        // otherwise, we show an error

        if ($upload) {
            // image is now uploaded, we first need to add column to the database
            $insert_id = DB::table('photos')->insertGetId(
                array(
                    'title' => Input::get('title'),
                    'image' => $fullname
                    )
                );
            // Now we redirect to the image's permalink
            return Redirect::to(URL::to('snatch/'.$insert_id))
                ->with('success', 'Your image is uploaded successfully!');
        }

        else {
            // Image cannot be uploaded
            return Redirect::to('/')->withInput()
                ->with('error', 'Sorry, the image could not be uploaded.');
        }
    }
    else {
        return Redirect::to('/')
            ->withInput()
            ->withErrors($validation);
    }
}

Image Model

图像模型

class Photo extends Eloquent {

// the variable that sets the table name
protected $table = 'photos';

// the variable that sets the table name
protected $fillable = array('title', 'image');

// the timestamps enabled
public $timestamps = true;

// Rules of the image upload form
public static $upload_rules = array(
        'title' => 'required|min:3',
        'image' => 'required|image'
    );

}

}

The view for the form

表单视图

@extends('frontend_master')

@section('content')

{{ Form::open(array('url' => '/', 'files' => true )) }}

{{ Form::text('title', '', array(
    'placeholder' => 'Please insert your title here')) }}

{{ Form::file('image') }}

{{ Form::submit('save', array('name' => 'send')) }}

{{ Form::close() }}

@stop

Let me know if you can find any bugs, I'm pretty sure something must be going wrong in my ImageController@postIndex

如果您能找到任何错误,请告诉我,我很确定我的 ImageController@postIndex 中一定有问题

Thanks for any insights

感谢您的任何见解

采纳答案by Jinseok Oh

2 things you need to check out.

您需要检查的 2 件事。

1st off, once you updated your composer.json to include the Intervention/Image package. you should run composer dump-autoloadto refresh the autoload file.

首先,一旦您更新了 composer.json 以包含 Intervention/Image 包。您应该运行composer dump-autoload以刷新自动加载文件。

2ndly, there's a logical error in your controller.

第二,您的控制器存在逻辑错误。

Image::make(Config::get('image.thumb_folder').'/'.$fullname)
    ->resize(Config::get('image.thumb_width'), null, true)
    ->save(Config::get('image.thumb_folder').'/'.$fullname);

should be

应该

Image::make(Config::get('image.image_folder').'/'.$fullname)
    ->resize(Config::get('image.thumb_width'), null, true)
    ->save(Config::get('image.thumb_folder').'/'.$fullname);

because you've already moved the image file to image_folder with the code below:

因为您已经使用以下代码将图像文件移动到 image_folder:

$upload = $image->move
    (Config::get('image.upload_folder'), $fullname);

Hope this helps.

希望这可以帮助。