Alexander Solonik
Alexander Solonik

Reputation: 10230

Can't write image data to path in laravel

I am having the same error as this guy is :

Another thread

basically the error i have is uploading the image to the specific path, my code is as follows :

public function postCreate() {

    $validator = Validator::make(Input::all() , Product::$rules);

    if ($validator->passes()) {
        $product = new Product;
        $product->category_id = Input::get('category_id');
        $product->title = Input::get('title');
        $product->description = Input::get('description');
        $product->price = Input::get('price');


        $image = Input::file('image');
        $filename = date('Y-m-d-H:i:s')."-".$image->getClientOriginalName();
        Image::make($image->getRealPath())->resize(468, 249)->save('public/img/products'.$filename);
        $product->image = 'public/img/products'.$filename;
        $product->save();

        return Redirect::to('admin/products/index')
             ->with('message' , 'Product created');
    }

    return Redirect::to('admin/products/index')->with('message' , 'something went wrong')
                ->withErrors($validator)->withInput();

} 

I was just trying to follow a tutorial on laravel e-commerce web application.

I guess the problem is that i don't have write permisson in my directory , how do i add write permission in my directory. I.E. the public folder, I googled a few places , but i don't understand what is it that i have to edit ?

I.E the htaccesss file or can i make write changes on the cmd ? also how do i check what weather a directory is write protected .

PS. i am using windows . i am attaching a screenshot of the error .

error

Thank you.

Upvotes: 4

Views: 18332

Answers (5)

Max Lyu
Max Lyu

Reputation: 39

I also recommend all of you to check if $path exists. Like Jose Seie use native PHP check, I recommend you to thought about build-in helpers. This can be achieved with File Facade helper:

File::exists($imagePath) or File::makeDirectory($imagePath, 777, true);

Advice you to use Laravel built-in functions, classes & helpers to improve the performance of your application!

Upvotes: 1

Jose Seie
Jose Seie

Reputation: 890

Generally this error occurs when you do not yet have the directory that will store the image inside the public directory. Sometimes it can be a permission issue.

Does you img directory exists in your public directory?

To fix this, follow the steps:

  1. Use this snippet:
$relPath = 'img/'; //your path inside public directory

if (!file_exists(public_path($relPath))) { //Verify if the directory exists
    mkdir(public_path($relPath), 666, true); //create it if do not exists
}

Or manually create the img directory in public

2.Then you can save your image:

Image::make($image)->resize(468, 249)->save(public_path('img/products'.$filename)); //save you image
$product->image = 'img/products'.$filename; //note
$product->save();

**NOTE: We do not need to specify the public directory in the path because we are using a relative path. The img directory will be created inside public directory.

Upvotes: 4

Rajeev K Tomy
Rajeev K Tomy

Reputation: 2214

Along with this, you need to make sure the folder path exists and which has right permissions set.

$relPath = 'img/product/';
if (!file_exists(public_path($relPath))) {
    mkdir(public_path($relPath), 777, true);
}

Where $relPath is the path relative to public directory.

This requirement is however windows specific. In linux, folder directory will be created if it does not exist.

Upvotes: 1

Alexander Solonik
Alexander Solonik

Reputation: 10230

well , i made the correction that john suggested and then made the following corrections :

I replaced the below code :

Image::make($image->getRealPath())->resize(468, 249)->save('public/img/products'.$filename);

with :

$path = public_path('img/products/'.$filename);
 Image::make($image->getRealPath())->resize(468, 249)->save($path);

problem solved , i don't know why public_path works , but never mind .

Upvotes: 0

VF_
VF_

Reputation: 2653

You might want to change the dateformat since windows doesn't allow colons in filenames:

$filename = date('Y-m-d-H:i:s')."-".$image->getClientOriginalName();

And you also might want to add a trailing slash to your path so it doesn't concatenate the filename to the folder path:

Image::make($image->getRealPath())->resize(468, 249)->save('public/img/products'.$filename);

Upvotes: 5

Related Questions