2015-02-18 2 views
0

У меня есть форма, которая загружает файл изображения на пост, очень просто и использует вмешательство, картинкуПочему загрузка изображения laravel показывает неправильный URL-адрес?

"intervention/image": "dev-master"

так что я могу изменить его размер и т.д., но в данный момент его простое почтовое действие, как так:

<?php namespace Boroughcc\Http\Controllers; 

use Input; 
use Redirect; 
use Storage; 
use SirTrevorJs; 
use STConverter; 
use Validator; 
use Image; 
use Boroughcc\Post; 
use Boroughcc\Http\Requests; 
use Boroughcc\Http\Controllers\Controller; 

use Illuminate\Http\Request; 

class PostsController extends Controller { 

public function store() 
    { 
     // image upload function 

     // $img = Image::make(Input::file('featured_image')); 
     // dd($img); 

     $input = Input::all(); 
     $validation = Validator::make($input, Post::$rules); 
     $entry = array(
      'title' => Input::get('title'), 
      'featured_image' => Input::file('featured_image')   
     ); 
     if ($validation->passes()) 
     { 
      $img = Image::make(Input::file('featured_image')); 

      $pathinfo = pathinfo($img); 
      $type = $pathinfo['basename']; 
      $filename = date('Y-m-d-H:i:s').$type; 
      $path = 'img/posts/' . $filename; 
      $img->save($path); 
      $post = Post::create(
       $entry 
      ); 
      return Redirect::route('posts.index')->with('message', 'Post created'); 
     } else { 
       return Redirect::route('posts.create') 
       ->withInput() 
       ->withErrors($validation) 
       ->with('message', 'There were validation errors.'); 
     } 

     //Post::create($input); 

     // return Redirect::route('posts.index')->with('message', 'Post created'); 


    } 

Пост проверяет правильность, и если все правильно, он отправляет сообщение, чтобы сохранить его и, надо надеяться, сгенерировать файл. Когда он сохраняет его, файл переходит в мою папку /public/img/posts/. вот приведенная ниже модель публикации;

Post.php

<?php namespace Boroughcc; 

use Illuminate\Database\Eloquent\Model; 

class Post extends Model { 

    // 
    protected $guarded = []; 

    public static $rules = array(
     'title' => 'required', 
     'featured_image' => 'required|image|mimes:jpeg,jpg,png,bmp,gif,svg' 
    ); 

} 

Таким образом, вы можете увидеть, что я пытаюсь вывести здесь является то, что я использую на странице post.index, чтобы вывести ссылку на изображение:

{!! Form::model(new Boroughcc\Post, ['route' => ['posts.store'], 'files' => true]) !!} 
<div class="form-group"> 
    {!! Form::label('title', 'Title:') !!} 
    {!! Form::text('title') !!} 
</div> 
<div class="form-group"> 
    <strong>Only edit this if necessary, this is auto populated</strong><br> 
    {!! Form::label('slug', 'Slug:') !!} 
    {!! Form::text('slug') !!} 
</div> 
<div class="form-group"> 
    {!! Form::label('featured_image', 'Featured Image:') !!} 
    {!! Form::file('featured_image') !!} 
</div> 
<div class="form-group"> 
    {!! Form::label('body', 'Post body:') !!} 
    {!! Form::textarea('body', null, array('id'=>'','class'=>'sir-trevor')) !!} 
</div> 
<div class="form-group"> 
    {!! Form::submit($submit_text, ['class'=>'btn primary']) !!} 
</div> 
{!! Form::close() !!} 

Когда я иду, чтобы получить файл URL для вывода я получаю вместо этого:

"featured_image" => "/private/var/folders/mf/srx7jt8s2rdg0mn5hr98cvz80000gn/T/phpMEtuuA"

Это то, что я получаю, что-то не так с этим и почему это делается только для этого?

+0

[http://laravel.com/docs/4.2/requests#files] Объект, возвращаемый методом файла является экземпляром Symfony \ Component \ HttpFoundation \ File \ UploadedFile класс, который расширяет класс PHP SplFileInfo и предоставляет множество методов для взаимодействия с файлом. – Brian

ответ

0

При загрузке файла в Laravel доступ к нему с помощью метода Input::file возвращает экземпляр Symfony\Component\HttpFoundation\File\UploadedFile, поэтому назначение 'featured_image' => Input::file('featured_image') не будет работать.

Поэтому, вместо того, чтобы создавать массив данных $entry, прежде чем сохранять файл на диск, вы должны фактически создать путь к изображению и имя файла и сохранить его в базе данных. Кроме того, если вы не хотите изменять размер изображения или манипулировать ими каким-либо образом, нет необходимости использовать библиотеку Intervention. Это должно делать только штрафом:

// Get the uploaded file object 
$image = Input::file('featured_image'); 

// Generate the necessary file details 
$extension = pathinfo($image->getClientOriginalName(), PATHINFO_EXTENSION); 
$filename = date('Y-m-d-H:i:s') . '.' . $extension; 
$path = 'img/posts/'; 

// Move the uploaded image to the specified path 
// using the generated specified filename 
$image->move($path, $filename); 

// Save the post to the database 
// using the path and filename use above 
$post = Post::create(array(
    'title' => Input::get('title'), 
    'featured_image' => $path . $filename 
)); 
+0

просто быстрый, как я могу получить расширение в конце файла, например .png? Я попробовал '$ type = pathinfo ($ img, PATHINFO_BASENAME);' и затем выполнил '$ filename = date ('Y-m-d-H: i: s'). $ extension. $ type; 'но он все равно возвращает пустой –

+1

В моем ответе была ошибка. Чтобы извлечь расширение, код должен быть '$ extension = pathinfo ($ image-> getClientOriginalName(), PATHINFO_EXTENSION);'. Также имя файла должно содержать '.' Вручную, поскольку 'pathinfo' возвращает расширение без точки в нем. Я обновил код в своем ответе. – Bogdan

Смежные вопросы