Change storage location in Laravel 5.4

Asked

Viewed 2,451 times

4

The current storage location of the Laravel is /Laravel/Storage/app/public. How do I change to /Laravel/public. I tried to edit filesystems.php but was unsuccessful:

Controller store function:

public function store(Request $request)
{
    $input = $request->all();
    $paciente = new Paciente($input);
    $paciente->save();

    if(empty($request->arquivo))
    {    
        return redirect()->action('PacienteController@index');
    } 
    else
    {
        $file = $request->arquivo;
        $fileName = $file->getClientOriginalName();
        $path = $request->file('arquivo')->storeAs('uploads', $fileName, 'upload');

        $arquivo = new Arquivo();
        $arquivo->paciente_id = $paciente->id;
        $arquivo->nome = $fileName;
        $arquivo->save();

        return redirect()->action('PacienteController@index');
    }   
}

Filesystems.php

return [

/*
|--------------------------------------------------------------------------
| Default Filesystem Disk
|--------------------------------------------------------------------------
|
| Here you may specify the default filesystem disk that should be used
| by the framework. The "local" disk, as well as a variety of cloud
| based disks are available to your application. Just store away!
|
*/

'default' => 'local',

/*
|--------------------------------------------------------------------------
| Default Cloud Filesystem Disk
|--------------------------------------------------------------------------
|
| Many applications store files both locally and in the cloud. For this
| reason, you may specify a default "cloud" driver here. This driver
| will be bound as the Cloud disk implementation in the container.
|
*/

'cloud' => 's3',

/*
|--------------------------------------------------------------------------
| Filesystem Disks
|--------------------------------------------------------------------------
|
| Here you may configure as many filesystem "disks" as you wish, and you
| may even configure multiple disks of the same driver. Defaults have
| been setup for each driver as an example of the required options.
|
| Supported Drivers: "local", "ftp", "s3", "rackspace"
|
*/

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],

    's3' => [
        'driver' => 's3',
        'key' => env('AWS_KEY'),
        'secret' => env('AWS_SECRET'),
        'region' => env('AWS_REGION'),
        'bucket' => env('AWS_BUCKET'),
    ],

    'upload' => [
        'driver' => 'local',
        'root' => public_path(),
        'visibility' => 'public',
    ],

],

];

2 answers

4


Create another configuration, example pictures, in your key root use the function public_path() indicating the directory public of your project:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Filesystem Disk
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default filesystem disk that should be used
    | by the framework. The "local" disk, as well as a variety of cloud
    | based disks are available to your application. Just store away!
    |
    */

    'default' => 'local',

    /*
    |--------------------------------------------------------------------------
    | Default Cloud Filesystem Disk
    |--------------------------------------------------------------------------
    |
    | Many applications store files both locally and in the cloud. For this
    | reason, you may specify a default "cloud" driver here. This driver
    | will be bound as the Cloud disk implementation in the container.
    |
    */

    'cloud' => 's3',

    /*
    |--------------------------------------------------------------------------
    | Filesystem Disks
    |--------------------------------------------------------------------------
    |
    | Here you may configure as many filesystem "disks" as you wish, and you
    | may even configure multiple disks of the same driver. Defaults have
    | been setup for each driver as an example of the required options.
    |
    | Supported Drivers: "local", "ftp", "s3", "rackspace"
    |
    */

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

        'pictures' => [
            'driver' => 'local',
            'root' => public_path(),
            'visibility' => 'public',
        ],

        's3' => [
            'driver' => 's3',
            'key' => env('AWS_KEY'),
            'secret' => env('AWS_SECRET'),
            'region' => env('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),
        ],

    ],

];

To save images use:

$result = $request->file('image');
$ext = $result->getClientOriginalExtension();
$result->storeAs('images', uniqid().'.'.$ext, 'pictures');

Observing: in the code the last change indicates the configuration created in the file filesystems.php

or

$result->store('images','pictures'); 

Observing: in the code the last change indicates the configuration created in the file filesystems.php


If you don’t want to use any of this you can do it for the traditional move that saves directly to the folder public (in the example case it was placed in the folder public/images):

$result = $request->file('image');
$ext = $result->getClientOriginalExtension();
$result->move('images', uniqid().'.'.$ext);

References:

  • I edited the post with the changes and with my complete method. When trying to upload the error occurs: Driver [] is not supported.

  • @Marcelo is an error in the configuration. From a check.

  • I took a look but I couldn’t find the error.

  • Strange @Marcelo is just like that

  • Before everything had given the command php Artisan Storage:link, can this influence anything? I don’t know if this is the best solution but I am trying it because my application uploads and downloads files. On my computer everything works normally, but in hosting the hostgator I can only upload the error. I put the Laravel application before the public_html directory and copied the contents of the public from the Laravel to public_html.

  • All files are copied except the symbolic link of Storage, informs that the file already exists. That’s why I’m trying to change the upload directory to the public folder.

  • 1

    It worked after php Artisan cache:clear and config:cache. Thank you.

  • Marcelo, did you solve the public folder problem? I’m having the same problem, it copies the file to Storage but does not point to the public_html folder, could help me?

Show 3 more comments

4

You don’t need to change anything in your code.

If you are using Linux (or the Homesteaden) just execute a command that makes a symlinken (symbolic link) between the /storage/app/public and /public/storage and so you can use the disk public hassle-free:

php artisan storage:link

See this in the documentationen.

You can do symlink also on Windows via command mklink and the Laravel already endures it, only this is restricted to administrators on the system.

Fortunately in the next system update, the Creators Update that will be simplifieden and even non-admin users can do this.

  • I did that and it works on my computer. The problem is that I was hosting the application and gave error when trying to download the file (the upload works), I believe that because it is not in the public_html of the hosting, directory above the application. For this reason I am trying to take the upload of the folder Storage and put in the public.

  • I do not know if there is a better way to work in the hosting, but it was the alternative that I thought.

  • Generally the hosts will overwrite you Marcelo. I recommend leaving them as soon as possible and looking for something where you have more control of the web server. There are plenty of options for all pockets, such as Heroku, digital Ocean, AWS, Zure and so on.

  • It really is one of the +1 options for the answer

Browser other questions tagged

You are not signed in. Login or sign up in order to post.