0
votes

I'm trying to store a file via AJAX to public folder in laravel, however when I submit the form I get the following message:

" message: "Impossible to create the root directory \"C:\xampp\htdocs\Restaurante1\storage\app\C:/xampp/htdocs/Restaurante1/public/img\".", exception: "League\Flysystem\Exception", file: "C:\xampp\htdocs\Restaurante1\vendor\league\flysystem\src\Adapter\Local.php"

I'm trying to store the file into the following folder inside public directory: public > img >uploads

This is my JQuery code:

console.log('new slider button clicked');
	
var formData = new FormData();
formData.append('title', $('#sliders_title').val());
formData.append('body', $('#sliders_body').val());
formData.append('isVisible', $('#sliders_isVisible').is(':checked') ? 1 : 0);
formData.append('image', $('#sliders_image').prop('files')[0]);


$.ajax({

    async: true,
    url: '/sliders',
    type: 'POST',
    data: formData,
    dataType: 'JSON',
    processData: false,
    contentType: false,
        
    success: function (data) { 
        $('.form_valid_container').html('<span class="form_valid_text">✓ '+ data.success +'</span>');
	    form.trigger("reset");
        console.log(data.success, data.errors);
    },

    error: function (data){
        var errors = data.responseJSON;
        console.log(errors);
	
	    $.each(errors , function(){
            $('.form_error_container').html('<span class="form_error_text">✘ '+ errors.message +'</span>')
        }); 
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

My controller method:

public function store(StoreSlider $request)
{
    $uploadFile = $request->file('image');

    //generate random filename and append original extension (eg: asddasada.jpg, asddasada.png)
    $filename = str_random(6).'.'.$uploadFile->extension();

    // storing path (Change it to your desired path in public folder)
    $path = 'img/uploads/';

    // Move file to public filder
    $uploadFile->storeAs(public_path($path), $filename);
	
    $slider = new Slider();
    $slider->title = $request->title;
    $slider->body = $request->body;
    $slider->image = $path.'/'.$filename; // So that you can access image by url($slider->image);
    $slider->isVisible = $request->isVisible;
    $slider->save();
	
    return response()->json([
	
        'success' => 'Diapositiva guardada correctamente',
		'slider' => $slider,
    ]);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

EDIT: This is my config/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' => env('FILESYSTEM_DRIVER', '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' => env('FILESYSTEM_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", "sftp", "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_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
        ],

    ],

];
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
3
show your config/filesystems.php fileRainDev
edited the OP with the infouser9982219
$uploadFile->storeAs(public_path($path), $filename); is your issue, change public_path($path) to something like img only, not a full on pathDerek Pollard
There is a problem, you trying to store file in storage directory $uploadFile->storeAs(public_path($path), $filename), if you wan't store it in public directory you need to add new disk in filesystems.php and then use this in storeAs() functionRainDev
@Derek i think he wan't store that file in public directory not in storage directoryRainDev

3 Answers

0
votes

My answer might not be relevant this very question but should in case someone encounters the same problem I think might be of help. I encountered the same problem and I "putFileAs" which worked the same way as "storeAs" like so $path = Storage::putFileAs('public/users_upload/'.$user->username, $File_to_be_moved, $file_name_to_store_as); First parameter is for the path to your directory... You can check the laravel documentation for more info here

0
votes

in your FileSystem, you need to create the driver disk.

'uploads' => [
        'driver' => 'local',
        'root' => public_path('img/uploads'),
        'url' => '/img/uploads',
        'visibility' => 'public',
    ],

and you can call in your controller storage

$uploadFile->storeAs('/', $filename, 'uploads');
-2
votes

Firstly, you should know that what you are doing is bad practice. But you should also know that the error is not because Laravel cannot do it. It's because Laravel couldn't find the path "img/uploads".

Solution 1: Manually create the directories and if you use a repository manager don't forget to add a .gitignore file in them if you are using Git.

Solution 2:

After:

// storing path (Change it to your desired path in public folder)
$path = 'img/uploads/';

add:

if(!file_exists(public_path($path)) || !is_dir(public_path($path)){
    @mkdir(public_path($path));
}

Solution 3 (How Laravel recommends we do it.):

Since you are using windows, you can create a symbolic link (actually a hard link but still does the same.)

Run command prompt (cmd) as administrator and type in:

mklink /J "laravel/public/file/directory/uploadsdirectory" "/path/to/laravel/roor/storage/app"

After that, you can change this:

$uploadFile->storeAs(public_path($path), $filename);

to:

$uploadFile->storeAs($path, $filename);

NOTE: I didn't get to try this codes/solutions, but they should work flawlessly.