Unable to write file into folder - laravel

hello i am still new to make localhost project into putty server and i also use fileZilla.
my upload image function is working fine in localhost but when i tried it in the server. the error happened like this
and here is my controller
public function uploadPic(Request $request)
{
$rules = ['image' => 'required|image|max:1024*1024*1'];
$validator = \Validator::make($request->all(),$rules);
if($validator->fails())
{
return redirect('profile')->withErrors($validator);
}
else
{
$file = $request->file('image');
$file->move(public_path("profile-image/"), $file->getClientOriginalName());
$thisUser = \Auth::id();
$result = User::where('id','=',$thisUser)->update(['path_gambar' => $file->getClientOriginalName()]);
}
return redirect('profile');
}
and here is the view blade
<form class="form-group-sm" action="{{ url('/upload-image') }}" method="post" enctype="multipart/form-data">
<input id="token" type="hidden" name="_token" value="{{ csrf_token() }}">
<div>
<input type="file" class="btn" name="image" id="file">
</div>
<span class="help-block">
<strong>{{ $errors->first('image') }}</strong>
</span>
<div style="text-align: inherit">
<button type="submit" class="btn btn-group-sm" value="upload" name="Submit">Upload</button>
</div>
</form>

Your issue is either a file system permission error or bad file path error.
The reason this works on your local machine is because your local system is more permissive -- your user has sufficient permissions to write the file or the system helps you resolve the bad path to a good one. This is likely because you are using an operating system, such as Windows, that does not enforce permissions the same way your *nix server does.
Let's look at these issues
Wrongly formatted file path
Non-existent file path
Insufficient permissions
Path
Look at your path. The double slash is a bad thing.
/var/www/html/gracia/public//profile-image
There may be some underlying issues but a quick fix to test is to use realpath().
$file->move(realpath(public_path("profile-image/")), $file->getClientOriginalName());
Now you must confirm that the directory actually exists on your server. SSH (putty) into the system and run:
ls -l /var/www/html/gracia/public
Or FTP in and navigate to the path.
The profile-image directory must be there.
Permission
SSH (putty) into the system and run:
ls -l /var/www/html/gracia/public
Output (example):
drwxr-xr-x 2 gracia users 4096 Jun 19 12:27 profile-image
These permissions mean that only the user gracia can write to the directory. It is likely that the web server does not run as this user, so you must change the permissions so that the directory is accessible to that user.
Here is how to make the directory write-able for all users.
chmod -R 777 public-image/
Output (example):
drwxrwxrwx 2 gracia users 4096 Jun 19 12:27 profile-image

Related

Laravel Breeze logout redirect on 127.0.0.1 on shared host

I have domain for example aaa.com. And I deploy Laravel on my webhost succesfully. Login, pages, all things etc. works fine. but whenever I logout it redirects me to 127.0.0.1 not aaa.com. Of course, I have to point out that I am using Laravel Breeze
and here is what I wrote:
my logout form inside any page.
<form method="POST" action="{{ route('logout') }}">
#csrf
<button type="submit" class="underline text-sm text-gray-600 hover:text-gray-900">
{{ __('Log Out') }}
</button>
</form>
My web.php include require __DIR__.'/auth.php'; . Does not contain any logout redirects.
and inside auth.php
Route::post('logout', [AuthenticatedSessionController::class, 'destroy'])
->name('logout');
and finally AuthenticatedSessionController.php
public function destroy(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
I don't understand why I am being redirected to 127.0.0.1 instead of aaa.com?
Edit:
and forgot to mention my .env file include
APP_URL=https://aaa.com
In .env file, Change APP_URL
APP_URL=http://aaa.com
Thank you to everyone who replied. It fixed itself the next day. It must be something left in the web host's cache, or your browser's. It's not a Laravel thing.

Larave - Heroku: file does not exist

I have an application in laravel 9, in my local environment I can upload images without problem (amazon s3), but in my deployment in heroku I get this error when trying to get the image I am sending.
<form action="/test-upload-file" method="POST" enctype="multipart/form-data">
#csrf
<input type="file" name="image" id="image">
<button type="submit">Upload File</button>
</form>
this is my function
Route::post("/test-upload-file", function (Request $request) {
$testFile = Storage::put('tests', $request->file('image'));
dd($testFile);
});
this is the error I am getting
The "" file does not exist or is not readable.
I just found the solution, it is for the PHP configuration of the server, just create a .user.ini configuration file in the /public folder.
post_max_size = 10M
upload_max_filesize = 10M

Laravel - CSRF Token Mismatch - Header Token gets regenerated

I'm struggeling the last 2 weeks on the following problem:
First of all my problem only occours when I try to deploy my current Laravel (6.11) project on the live server. On my Localhost everything works fine.
In every FORM I used the #csrf tag to set the token as well as the meta tag in the head section of my page. If I search into the developer tool in Chrome the tokens in head and form match perfectly. When the POST request gets sent I get an 419 Page Expired error. I figured out that the HEAD token gets recreated on each request so a token mismatch occours.
I already tried the following things:
Diffrent syntax of the csrf tag
I excepted all FORMS in the VerifyCsrfToken.php - these ended up in a redirect to my index.php without submited form
I checked all Laravel config settings which were recommended in diffrent Forum Posts
I tried a empty laravel installation with a basic login setup on my server - This worked
I currently work with git. On the a previous commit version (16th of december) which I uploaded to my server on that exact Date I had no problem at all but when I tried to reupload the exact same git commit date, the same problem happens.
Greatings Max
If you need any code I'll upload here.
Controller:
function fakeAuthentifizierung(Request $request){
$username = $request->input('benutzernameLogin');
$password = $request->input('passwortLogin');
session(['key' => 'mt171043']);
session(['eingeloggt' => true]);
/*****
* ABFRAGE ADMINRECHTE
* BITTE DIESEN TEIL SPÄTER IN ECHTE AUTHENTIFIZIERUNG ÜBERNEHMEN
*
*/
$admin = false;
// SPÄTER BENUTZERID AUS LOGIN SESSION ÜBERGEBEN
// astmedin5 als TESTZWECK
$rechte = Benutzer::getBenutzerBerechtigung("astmedin5");
//Berechtigung Abfragen
if($rechte->name != 'Student' && 'Lehrbeauftragter'){
session(['admin' => true]);
}else{
session(['admin' => false]);
}
/***
*
* ABFRAGE ENDE
*/
return redirect(route('index',app()->getlocale()));
}
View:
<form method="POST" action="{{ action('LoginController#FakeAuthentifizierung', app()->getLocale()) }}">
#csrf
<h1>{{ __('Login') }}</h1>
<label class="col" for="benutzernameLogin">{{ __('Benutzername') }}</label>
<input name="benutzernameLogin" id="benutzernameLogin" class="inputLogin col mb-4" type="text"
aria-label="Text input with checkbox" placeholder="{{ __('Benutzername') }}" required>
<label class="col" for="passwortLogin">{{ __('Passwort') }}</label>
<input name="passwortLogin" id="passwortLogin" class="inputLogin col mb-4" type="password"
aria-label="Text input with checkbox" placeholder="{{ __('Passwort') }}" required>
<div class="col-8 float-left">
<input id="checkboxPasswortAnzeigen" type="checkbox">
<label for="checkboxPasswortAnzeigen">{{ __('Passwort anzeigen') }}</label>
</div>
<button type="submit" class="btn-slash col-3 inverted fontLight float-right">{{ __('Login') }}</button>
</form>

corrupted file after upload in laravel public disk

I'm using this code to upload some file to storage in laravel:
$username=Auth::user()->name;
$patz=Storage::url("users/".$username."_".Auth::user()->id);
$now= new \Carbon\Carbon();
$fileName = 'ddt_'.$username."_".$now->getTimestamp().'.'.$request->ddt_file->getClientOriginalExtension();
$pathComplete=$request->ddt_file->storeAs($patz,$fileName);
$ddt_file_url= new Ddt_file_url(); //salvare ddt e poi prendere id
$ddt_file_url->fileUrl = $pathComplete;
$ddt_file_url->fileName = $fileName;
$ddt_file_url->company()->associate(Auth::user()->id);
$ddt_file_url->save();
The file is present in the folder but the file is corrupted and when I try do dowload it this not works.
This is the code that im using for the download too:
#if($ddtR->ddt_file_url_id)
<a href="{{asset(Storage::url($ddt_urls->where('id',$ddtR->ddt_file_url_id)->first()->fileUrl))}}" download="{{$ddt_urls->where('id',$ddtR->ddt_file_url_id)->first()->fileName}}">
<button type="button" class="btn btn-default">
Download ddt file <span class="fa icon-icona_download-01">
</span>
</button>
</a>
#else
<p>-</p>
#endif
I ran several dd() over $patz and $pathComplete to me both looks correct!
this is how I solve it... I dont know if its the best and cleaner solution:

TokenMismatchException in VerifyCsrfToken.php Line 67

I know that this is a known error with things like forms in Laravel. But I am facing an issue with basic authentication in Laravel 5.2.
I created the auth using Laravel;
php artisan make:auth
Now I have the same copy of code on my server and my local. On my local I am getting no issue whatsoever. However on my server, when I try to register a user I get the error saying TokenMismatchException in VerifyCsrfToken.php Line 67
Both my local and server environments are in sync, yet I keep getting the error on registration. Any help on how I can fix this?
I'm assuming you added $this->middleware('auth'); inside the constructor of your controller to get the authentication working. In your login/register forms, if you are using {!! Form::someElement !!}, add the following line at the top as well:
{!! csrf_field() !!}
Or if you are using input tags inside your forms, just add the following line after <form> tag:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Hope this helps.
I had a similar issue and it was an easy fix.
Add this in your HTML meta tag area :
<meta name="csrf-token" content="{{ csrf_token() }}">
Then under your JQuery reference, add this code :
<script type="text/javascript">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
If you are using the HTML form submit (not AJAX) then you need to put :
{{ csrf_field() }}
inside your form tags.
I was about to start pulling out my hair!
Please check your session cookie domain in session.php config. There is a domain option that has to match your environment and it's good practice to have this configurable with you .env file for development.
'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),
If nothing is working you can remove the CSRF security check by going to App/Http/Middleware/VerifyCsrfToken.php file and adding your routes to protected $excpt.
e.g. if i want to remove CSRF protection from all routes.
protected $except = [
'/*'
];
P.S although its a good practice to include CSRF protection.
You need to have this line of code in the section of your HTML document, you could do that by default , it won't do any harm:
<meta name="csrf-token" content="{{ csrf_token() }}" />
And in your form you need to add this hidden input field:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Thats it, worked for me.
I was facing the same issue with my application running on laravel 5.4
php artisan session:table
php artisan make:auth
php artisan migrate
.. and then following command works for me :)
chmod 777 storage/framework/sessions/
One more possibility of this issue, if you have set SESSION_DOMAIN (in .env) different than HOST_NAME
Happy coding
I have also faced the same issue and solved it later.
first of all execute the artisan command:
php artisan cache:clear
And after that restart the project.
Hope it will help.
Your form method is post. So open the Middleware/VerifyCsrfToken .php file , find the isReading() method and add 'POST' method in array.
There are lot of possibilities that can cause this problem.
let me mention one.
Have you by any chance altered your session.php config file?
May be you have changed the value of domain from null to you site name or anything else in session.php
'domain' => null,
Wrong configuration in this file can cause this problem.
By default session cookies will only be sent back to the server if the browser has a HTTPS connection. You can turn it off in your .env file (discouraged for production)
SESSION_SECURE_COOKIE=false
Or you can turn it off in config/session.php
'secure' => false,
I also get this error, but I was solved the problem. If you using php artisan serve add this code {{ csrf_field() }} under {!! Form::open() !!}
php artisan cache:clear
Clear cache & cookies browser
Using Private Browser (Mozilla) / Incognito Window (Chrome)
Open your form/page and then submit again guys
I hope this is solve your problem.
Make sure
{!! csrf_field() !!}
is added within your form in blade syntax.
or in simple form syntax
<input type="hidden" name="_token" value="{{ csrf_token() }}">
along with this,
make sure, in session.php (in config folder), following is set correctly.
'domain' => env('SESSION_DOMAIN', 'sample-project.com'),
or update the same in .env file like,
SESSION_DOMAIN=sample-project.com
In my case {!! csrf_field() !!} was added correctly but SESSION_DOMAIN was not configured correctly. After I changed it with correct value in my .env file, it worked.
change the session driver in session.php to file mine was set to array.
Can also occur if 'www-data' user has no access/write permissions
on the folder:
'laravel-project-folder'/storage/framework/sessions/
Below worked for me.
<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
Have you checked your hidden input field where the token is generated?
If it is null then your token is not returned by csrf_token function.You have to write your route that renders the form inside the middleware group provide by laravel as follows:
Route::group(['middleware' => 'web'], function () {
Route::get('/', function () {
return view('welcome');
});
Here root route contains my sign up page which requires csrf token. This token is managed by laravel 5.2.7 inside 'web' middleware in kernel.php.
Do not forget to insert {!! csrf_field() !!} inside the form..
Go to app/provides.
Then, in file RouteServiceProvider.php, you'll have to delete 'middleware' => 'web' in protected function mapWebRoutes(Router $router)
The problem by me was to small post_max_size value in php.ini.
Put this code in between <form> and </form> tag:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
I had the same issue but I solved it by correcting my form open as shown below :
{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}
If this doesn't solve your problem, can you please show how you opened the form ?
You should try this.
Add {{ csrf_field() }} just after your form opening tag like so.
<form method="POST" action="/your/{{ $action_id }}">
{{ csrf_field() }}
Are you redirecting it back after the post ? I had this issue and I was able to solve it by returning the same view instead of using the Redirect::back().
Use this return view()->with(), instead of Redirect::back().
For me, I had to use secure https rather than http.
try changing the session lifetime on config/session.php like this :
'lifetime' => 120, to 'lifetime' => 360,
Here I set lifetime to 360, hope this help.
I got this error when uploading large files (videos). Form worked fine, no mismatch error, but as soon as someone attached a large video file it would throw this token error. Adjusting the maximum allowable file size and increasing the processing time solved this problem for me. Not sure why Laravel throws this error in this case, but here's one more potential solution for you.
Here's a StackOverflow answer that goes into more detail about how to go about solving the large file upload issue.
PHP change the maximum upload file size
In my case, I had a problem when trying to login after restarting server, but I had csrf field in the form and I didn't refresh the page, or it kept something wrong in the cache.
This was my solution. I put this piece of code in \App\Http\Middleware\VerifyCsrfToken.php
public function handle($request, Closure $next)
{
try {
return parent::handle($request, $next); // TODO: Change the autogenerated stub
} catch(TokenMismatchException $e) {
return redirect()->back();
}
}
What it does is catching the TokenMismatchException and then redirecting the user back to the page (to reload csrf token in header and in the field).
It might not work always, but it worked for my problem.
Try php artisan cache:clear or manually delete storage cache from server.
If you check some of the default forms from Laravel 5.4 you fill find how this is done:
<form class="form-horizontal" role="form" method="POST" action="{{ route('password.email') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required> #if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span> #endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Send Password Reset Link
</button>
</div>
</div>
</form>
{{ csrf_field() }}
is the most appropriate way to add a custom hidden field that Laravel will understand.
csrf_filed() uses csrf_token() inside as you can see:
if (! function_exists('csrf_field')) {
/**
* Generate a CSRF token form field.
*
* #return \Illuminate\Support\HtmlString
*/
function csrf_field()
{
return new HtmlString('<input type="hidden" name="_token" value="'.csrf_token().'">');
}
}
And csrf_field() method uses session for the job.
function csrf_token()
{
$session = app('session');
if (isset($session)) {
return $session->token();
}
throw new RuntimeException('Application session store not set.');
}
I have same issue when I was trying out Laravel 5.2 at first, then I learnt about {{!! csrf_field() !!}} to be added in the form and that solved it. But later I learnt about Form Helpers, this takes care of CSRF protection and does not give any errors. Though Form Helpers are not legitimately available after Laravel 5.2, you can still use them from LaravelCollective.
Got to your laravel folder :: App/http/Middleware/VerifyCsrfToken.php
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* #var array
*/
protected $except = [
// Pass your URI here. example ::
'/employer/registration'
];
}
And it will exclude this url from the Csrf validation. Works for me.

Resources