Upload no Laravel 5 Artigo

Conheça os cursos gratuitos do WebDevBr! - Inscreva-se!


Este artigo foi publicado a 2 anos, 3 meses, 1 semana, 4 dias atrás.

Neste artigo vamos falar um pouco sobre upload usando o Laravel 5.1, a grande vantagem que ví logo de cara é que ele usa o HttpFoundation nos bastidores, já comecei me sentindo em casa. Outra vantagem é que o \Input::file() automatiza tudo, é impressionante.

O formulário

Para o HTML do formulário eu crieu uma nova view em resouces/views/products/upload.blade.php com o seguinte código.

<form action="" method="post" enctype="multipart/form-data">
    {{ csrf_field() }}
    <input type="file" name="photo">
    <input type="submit">
</form>

Prontinho, não esqueça do enctype="multipart/form-data"!

Gostou deste artigo?

Receba atualizações semanais com novos artigos do WebDevBr e outras dicas!

O controller e rotas

O controller também não tem segredos, usei duas action (acho mais organizado):

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ProductsController extends Controller
{
    public function upload()
    {
    }

    public function move()
    {
    }
}

Na action upload() eu apenas exibo o formulário e na move() realizado a ... mágica!

As rotas ficaram assim:

Route::get('/upload', 'ProductsController@upload');
Route::post('/upload', 'ProductsController@move');

Prontinho, vamos brincar!

O Upload

agora que já temos nossa estrutura definina vamos entender o upload. claro, vamos trabalhar dentro da action move().

A primeira coisa que precisamos é ter acesso ao arquivo enviado, e aqui temos um objeto do Symfony\Component\HttpFoundation\File\UploadedFile, ta não e tão complicado quanto esse namespace, veja como fazer.

$file = \Input::file('photo'); //note que 'photo' remete ao nome do campo no formulário
    var_dump($file);

Eu tenho o Xdebug e visualizo o código mais facilmente em alguns casos, use o dd() se preferir. A saída deste comando deve ser algo como:

object(Symfony\Component\HttpFoundation\File\UploadedFile)[29]
private 'test' => boolean false
private 'originalName' => string 'Captura de tela de 2015-08-04 16:00:06.png' (length=42)
private 'mimeType' => string 'image/png' (length=9)
private 'size' => int 369110
private 'error' => int 0
private 'pathName' (SplFileInfo) => string '/tmp/phphnNK5P' (length=14)
private 'fileName' (SplFileInfo) => string 'phphnNK5P' (length=9)

Temos muitas informações que você pode obter através dos devidos métodos (guessClientExtension(), getError(), getClientMimeType()...), mas deixo isso pra documentação, se não o artigo vai ficar imenso.

Você pode inclusive aproveitar para verificar se o arquivo foi enviado usando o hasFile().

if (\Input::hasFile('photo'))
    return 'Ok';
return 'Erro';

E finalmente mover para o destino final.

    $file = \Input::file('photo');

    $destinationPath = public_path().DIRECTORY_SEPARATOR.'files';
    $fileName = '01.'.pathinfo('Hearthstone.desktop')['extension'];

    var_dump($file->move($destinationPath, $fileName));

O método move() é o que realmente vai mover o arquivo para o diretório final, ele aceita dois parâmetros, o primeiro informa o diretório de salvamento, o segundo é o nome final e é opcional, caso não seja informado ele usará o nome original (o temporário, não do pc, pelo menos por enquanto).

Estes são os comportamentos padrão e o que você precisa para já começar a fazer upload agora mesmo, mas ainda temos outras opções a explorar, para isso deixo um link direto para a fonte: http://laravel.com/docs/5.1/requests#files.

O meu controller completo com o estudo sobre Uploads.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ProductsController extends Controller
{
    public function upload()
    {
         return view ('products.upload');
    }

    public function move()
    {
        $file = \Input::file('photo'); // retorna o objeto em questão

        var_dump($file);
        var_dump(\Input::hasFile('photo'));

        $destinationPath = public_path().DIRECTORY_SEPARATOR.'files';
        $fileName = '01.'.pathinfo('Hearthstone.desktop')['extension'];

        //var_dump($file->move($destinationPath.DIRECTORY_SEPARATOR.'tmp'));
        var_dump($file->move($destinationPath, $fileName));
    }
}

Att. Erik Figueiredo


Cursos relacionados


* Parcelamento apenas cartão de crédito! Pode haver uma pequena variação no parcelamento em relação a simulações apresentadas!