I want to validate a file upload but with literally any validation rule, I get "The (name of input) failed to upload." I've seen this issue in a few places but none of the solutions worked for me.
I'm using Laravel 8.0, php 8.0.2, and nginx/1.18.0 on ubuntu.
Controller:
public function uploadMedia (Request $request)
{
$request->validate([
'file' => 'required',
'alt' => 'required',
]);
dd('valid');
}
Blade file:
#if($errors->any())
#foreach ($errors->all() as $error)
<p class="alert error">{{ $error }}</p>
#endforeach
#endif
<form method="POST" action="/media" enctype="multipart/form-data">
#csrf
<input type="file" name="file" />
<input type="text" name="alt" placeholder="Write a short description of the image under 160 characters." />
<button type="submit">Upload</button>
</form>
If I get rid of the validation rule for 'file' it works, I get to the dd.
$request->validate([
'file' => '', // works if I do this
'alt' => 'required',
]);
I've seen other people have this issue and I've tried:
Putting another rule (max:10000, image) instead of 'required'
for the file – still get the same error.
Changing the values php.ini to post_max_size = 201M and
upload_max_filesize = 200M (this shouldn't be an issue in the
first place because the image I am trying to upload is a 136kb jpg). Verified with phpinfo();
After changing these values, reloading nginx and php-fpm
Rebooting the VM
Checking that all the double and single quotes are the correct character
Trying to upload other filetypes like png or txt, same error.
Putting 'image' as the first validation rule which worked for someone here
Removing the extra comma at the end of the rules array
Changing the name of the file input to something other than 'file'
Using a different browser (Firefox and Chrome)
Disabling all my browser extensions
Writing the validation like this instead (still get the same error):
$validator = Validator::make($request->all(), [
'file' => 'required',
'alt' => 'required'
]);
if ($validator->fails()) {
return redirect('/media')->withErrors($validator);
}
If I dd($request) before validating:
Illuminate\Http\Request {#44 ▼
#json: null
#convertedFiles: null
#userResolver: Closure($guard = null) {#255 ▶}
#routeResolver: Closure() {#264 ▶}
+attributes: Symfony\Component\HttpFoundation\ParameterBag {#46 ▶}
+request: Symfony\Component\HttpFoundation\ParameterBag {#45 ▼
#parameters: array:2 [▼
"_token" => "RrjAA2YvnSd3EYqg8vAwoWT4y6VenJzGjb5S72SU"
"alt" => "dsfghdf"
]
}
+query: Symfony\Component\HttpFoundation\InputBag {#52 ▶}
+server: Symfony\Component\HttpFoundation\ServerBag {#49 ▶}
+files: Symfony\Component\HttpFoundation\FileBag {#48 ▼
#parameters: array:1 [▼
"file" => Symfony\Component\HttpFoundation\File\UploadedFile {#33 ▼
-test: false
-originalName: "Screen Shot 2021-03-08 at 9.33.19 AM.png"
-mimeType: "application/octet-stream"
-error: 6
path: ""
filename: ""
basename: ""
pathname: ""
extension: ""
realPath: "/var/www/[my domain]/public"
aTime: 1970-01-01 00:00:00
mTime: 1970-01-01 00:00:00
cTime: 1970-01-01 00:00:00
inode: false
size: false
perms: 00
owner: false
group: false
type: false
writable: false
readable: false
executable: false
file: false
dir: false
link: false
}
]
}
+cookies: Symfony\Component\HttpFoundation\InputBag {#47 ▶}
+headers: Symfony\Component\HttpFoundation\HeaderBag {#50 ▶}
#content: null
#languages: null
#charsets: null
#encodings: null
#acceptableContentTypes: null
#pathInfo: "/media"
#requestUri: "/media"
#baseUrl: ""
#basePath: null
#method: "POST"
#format: null
#session: Illuminate\Session\Store {#296 ▶}
#locale: null
#defaultLocale: "en"
-preferredFormat: null
-isHostValid: true
-isForwardedValid: true
-isSafeContentPreferred: null
basePath: ""
format: "html"
}
Error value of 6 means UPLOAD_ERR_NO_TMP_DIR. Ensure that your system has a properly configured upload temp directory by running php -i from command line (or phpinfo(); from a web page) and checking for the upload_tmp_dir key. On a typical Linux system this will be something like /tmp. You can set the value in php.ini if needed. Ensure permissions are correct on the listed folder, such that the web server process is allowed to write to it.
Do not attempt to use one of your publicly-accessible folders as an upload directory (e.g. saving directly to storage/app/public or similar.) Your application code should move the file into storage as described in the documentation; something like this:
public function uploadMedia(Request $request)
{
$request->validate([
'file' => ['required', 'file', 'image'],
'alt' => ['required', 'string'],
]);
$path = $request->file->store('images');
return redirect()->route('whatever')->with('success', "File saved to $path");
}
Related
i'm having a problem with laravel 8, i really don't know what i'm doing wrong but the files are skipping the required rule in the validation, i'm sending the form with an array of names and files, and executing the validation in the controller:
public function store(StoreExamenRequest $examenRequest, StoreResultadoRequest $resultadoRequest)
{
$validacionExamen = $examenRequest->validated();
$validacionResultado = $resultadoRequest-validated();
the part that is not validating the file is $resultadoRequest-validated(); This is the content of StoreResultadoRequest
class StoreResultadoRequest extends FormRequest {
public function authorize()
{
return true;
}
public function rules()
{
$this->redirect => url()->previous();
return [
'NombreResultado.*' => 'required|string',
'ArchivoResultado.*' => 'required|file|mimes:pdf|max:1024',
];
}
public function messages()
{
return [
'NombreResultado.required' => __('NombreResultado.required'),
'ArchivoResultado.required' => __('ArchivoResultado.required'),
'ArchivoResultado.file' => __('ArchivoResultado.file'),
'ArchivoResultado.mimes' => __('ArchivoResultado.mimes'),
'ArchivoResultado.max' => __('ArchivoResultado.max')
];
}
}
NombreResultado.required required rule is validating ok, the problem is with ArchivoResultado.required it is validating all the rules except for the required rule. I’ve tried deleting all the other rules and leaving only that rule but it's not working. This is a dd of the $validacionResultado in the controller when i submit the form without the file:
array:1 [
"NombreResultado" => array:1 [
0 => "Name of the file"
]
]
This is a dd with the file attached:
array:2 [
"NombreResultado" => array:1 [
0 => "Name of the file"
]
"ArchivoResultado" => array:1 [
0 => Illuminate\Http\UploadedFile {#1328
-test: false
-originalName: "factura_00000525.pdf"
-mimeType: "application/pdf"
-error: 0
#hashName: null
path: "/private/var/tmp"
filename: "phpoVUvWV"
basename: "phpoVUvWV"
pathname: "/private/var/tmp/phpoVUvWV"
extension: ""
realPath: "/private/var/tmp/phpoVUvWV"
aTime: 2021-03-13 04:53:56
mTime: 2021-03-13 04:53:56
cTime: 2021-03-13 04:53:56
inode: 80503611
size: 136213
perms: 0100600
owner: 70
group: 0
type: "file"
writable: true
readable: true
executable: false
file: true
dir: false
link: false
}
]
]
i'm not attaching a dd of $resultadoRequest because it's too long. Can you please point me in the right direction?
You want to check that the array of files is present and not empty, then check each file in the array. You already have the part that checks each file in the array, so add the check of array itself.
return [
'NombreResultado.*' => 'required|string',
'ArchivoResultado' => 'required|array',
'ArchivoResultado.*' => 'required|file|mimes:pdf|max:1024',
];
I'm trying to add ar language to my website but I have a problem the body is not saving it saves <p> </p>
I have the request printed how I receive it when updating a post with 2 languages ar, en.
The request is as this with some dummy text
Request {#57 ▼
#json: null
#convertedFiles: array:2 [▶]
#userResolver: Closure {#1935 ▶}
#routeResolver: Closure {#1994 ▶}
+attributes: ParameterBag {#67 ▶}
+request: ParameterBag {#66 ▼
#parameters: array:17 [▼
"_token" => "LjyJ1cgN5tn7yxFbjyHRPAnRzqRKWg8ojRYM7cMP"
"title_i18n" => "{"en":"Data Services","ar":"خدمة البيانات"}"
"title" => "Data Services"
"body_i18n" => "{"ar":""}"
"body" => """
<pre style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.9px; margin-top: 0px; mar ▶
* Set whether or not the multilingual is supported by the BREAD input.\r\n
*/\r\n
'bread' => true,</code></pre>
"""
"excerpt_i18n" => "{"en":"as ds as d","ar":"as das s dsa"}"
"excerpt" => "as ds as d"
"slug_i18n" => "{"en":"data-services1","ar":"khdmh-albyanat"}"
"slug" => "data-services1"
"status" => "PUBLISHED"
"category_id" => "3"
"meta_description_i18n" => "{"en":"as das dsa d","ar":"asd as dasd a"}"
"meta_description" => "as das dsa d"
"meta_keywords_i18n" => "{"en":"as das","ar":"a sdas "}"
"meta_keywords" => "as das"
"seo_title_i18n" => "{"en":"Design and conduct surveys and measure relevant indicators in all areas","ar":"Design and conduct surveys and measure relevant indicators in all areas"}"
"seo_title" => "Design and conduct surveys and measure relevant indicators in all areas"
]
}
+query: ParameterBag {#65 ▶}
+server: ServerBag {#70 ▶}
+files: FileBag {#69 ▶}
+cookies: ParameterBag {#68 ▶}
+headers: HeaderBag {#71 ▶}
#content: null
#languages: null
#charsets: null
#encodings: null
#acceptableContentTypes: null
#pathInfo: "/admin/posts"
#requestUri: "/admin/posts"
#baseUrl: ""
#basePath: null
#method: "POST"
#format: null
#session: Store {#2051 ▶}
#locale: null
#defaultLocale: "en"
-isHostValid: true
-isForwardedValid: true
basePath: ""
format: "html"
}
My voyager.php for multilanguage config is like this
'multilingual' => [
/*
* Set whether or not the multilingual is supported by the BREAD input.
*/
'bread' => true,
/*
* Set whether or not the multilingual is supported by the BREAD input.
*/
'enabled' => true,
/*
* Set whether or not the admin layout default is RTL.
*/
'rtl' => false,
/*
* Select default language
*/
'default' => 'en',
/*
* Select languages that are supported.
*/
'locales' => [
'en',
'ar',
],
],
What would be the problem?
I searched a lot, finally I tried to solve it by turning around. The solution or let's say the problem here is in this file:
posts/add-edit.blade.php
and if you remove it the bread will work perfectly with default template for posts add-edit. I think this will help a little but I don't know why this issue appear.
I tried to set cookie (easy example):
Route::get('set', function () {
Cookie::queue(Cookie::forever('cart_id', 123));
});
Route::get('get', function (Illuminate\Http\Request $request) {
dump($request);
});
But I get in dump of $request:
Request {#40 ▼
...
+cookies: ParameterBag {#43 ▼
#parameters: array:3 [▼
"cart_id" => null
"XSRF-TOKEN" => null
"laravel_session" => null
]
}
+headers: HeaderBag {#46 ▼
#headers: array:9 [▼
...
"cookie" => array:1 [▼
0 => "cart_id=eyJpdiI6IldNbjJwMHdRclBmWkFkUFJ3SnJ6Z2c9PSIsInZhbHVlIjoiVnhBWGl3ODFBaGhwTCtSc0NoSmlLUT09IiwibWFjIjoiYjU2NjRmNDI4OGQ4NGZmZjNjMDhmYTEwMWJlOWQ2ZjUwYjAxNTMxYjU2OWY3Y2I0NjYxNzQzZTNhZjVkMDcxOSJ9; XSRF-TOKEN=eyJpdiI6Ino2ckNVSU5cL3VEcE5VQWRqQm1wTkV3PT0iLCJ2YWx1ZSI6IkF2b1Y0VDFkMlVqam8zeWVJQk55Mm96XC9PZFlyZUxma3FBTXNBV2VoK3AyTkp5Q2RNOHZtQnRyMFB0a3c0Mm5cL1hJdkkyY1haUHhZV0FEejdKSjMzaHc9PSIsIm1hYyI6IjFlNjVkZDE2NDJiYjA2MDQzM2JiYWYzMWY2YWRiNTk0ZDM4MjBlNmEzZmEwNTUxZWUzY2NmYmEyZDljMmYwOGIifQ%3D%3D; laravel_session=eyJpdiI6Imh1QW1iamlscnVpV3JFTThHYWdTNkE9PSIsInZhbHVlIjoiZElUMU1MZlRwa1BRZFd6T0pWMGhSanNCcmVNcjdEUGJrd2Zhc3RqbFUzVFBOamxsclBnbWhHcVk4QXFXU2VFMkVGYXBUSm4xVVFvcGZoZnVxN1VTVnc9PSIsIm1hYyI6IjkyYjA5YTI3MmE3MWE5OWRhNDBjYWZkZjQwZjk0NjI1OTY4MGNjZDM4ZDQ4YWE3YjdkMWMxNmQwZjgxMzQzZTYifQ%3D%3D"
]
]
#cacheControl: array:1 [▶]
}
}
Of course, firstly I go to /set link, then /get.
Where did I go wrong? Why all of my cookies equals to null?
By the way, last 5 hours I tried to make a function, that will contains Cookie::queue() function, but it goes wrong too. I dont know, what's wrong with my laravel cookies
Maybe is silly question but I have this in my Controller which is showing the form for image upload and after form is submitted should return me to another view.
On this another view I have passing variable with all images but still I've got
Undefined variable: images
So this is what I have in my Controller
// Display all Images
public function images()
{
$images = Images::paginate(3);
return view('images', compact('images'));
}
// Display image upload form
public function imageCreate()
{
return view('create');
}
// Submit and store image
public function imageStore( Request $request )
{
$image = new Images([
'caption' => $request['caption'],
'name' => $request['caption'],
'path' => 'uploads/noimage.png',
'hits' => 1,
'added_on' => '2017-08-08 9:00:00'
]);
$image->save();
return view('images', compact('images'));
}
And this in my view images.blade.php
#foreach($images as $image)
<img class="thumbnail block" src="{{ '../'.$image->path }}">
#endforeach
So, why variable is undefined if I posting it in the return view statement?
Update: dd($image) in the view return
Images {#234 ▼
#primaryKey: "id"
#table: "images"
+timestamps: false
+fillable: array:6 [▶]
#connection: null
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: true
#attributes: array:7 [▼
"caption" => "dasdsadsad"
"name" => "dasdsadsad"
"path" => "uploads/noimage.png"
"hits" => 1
"added_on" => "2017-08-08 9:00:00"
"slug" => "dasdsadsad-7"
"id" => 144
]
#original: array:7 [▶]
#casts: []
#dates: []
#dateFormat: null
#appends: []
#events: []
#observables: []
#relations: []
#touches: []
#hidden: []
#visible: []
#guarded: array:1 [▶]
}
Update 2: routes
Route::get('images', 'HomeController#images');
Route::get('create',['as'=>'create','uses'=>'HomeController#imageCreate']);
Route::post('create',['as'=>'store','uses'=>'HomeController#imageStore']);
The issue is here:
compact('images'));
but your variable is $image. So change it to:
compact('image'));
and try again. And also change the foreach() variable name like:
#foreach($image as $img)
...
$img->slug
$img->path
Explanation:
The variable that contains the data is $image and the one you are passing from controller is compact('images')). An extra s is there.
passing-data-from-controller-to-views
error int this line
return view('images', compact('images'));
your variable name is $image and you pass $images
replace above line with this
return view('images', compact('image'));
public function imageStore( Request $request )
{
$image = new Images([
'caption' => $request['caption'],
'name' => $request['caption'],
'path' => 'uploads/noimage.png',
'hits' => 1,
'added_on' => '2017-08-08 9:00:00'
]);
$imagePath='uploads/noimage.png';
$image->save();
return view('images')->with('image',$imagePath);
}
you get path like this
<a href="{{ URL::to('image/'.$image->slug) }}">
<img class="thumbnail block" src="{{url('/'.$image)}}">
</a>
Laravel assumes when you use the compact function that the variable you are passing is named the same as the variable you are passing in the route. For instance:
route::get('/customer/{customer_id}', 'CustomerController#show');
Therefore in your controller when returning data with your view you need to do something like:
return view('customer', ['customer_name' => $customer->name]);
Then you should be able to reference it in your view like:
{{$customer_name}}
Need send request to controller Category from Wizard.
Wizard action:
$request = Request::create('/admin/category', 'POST', $this->prepare_category($row->toArray()));
Route::dispatch($request);
Category action:
public function store(Request $request, ContentPlugins $plugins)
{
dd(Request::all());
}
The request passes but Request::all() is empty []
dd on $request:
Request {#1922 ▼
#json: null
#userResolver: null
#routeResolver: null
+attributes: ParameterBag {#1859 ▼
#parameters: []
}
+request: ParameterBag {#1726 ▼
#parameters: array:11 [▼
"title" => "Фотосувениры"
"level" => "0"
"description" => null
"cost" => null
"what" => null
"type" => "catalog"
"parent" => 0
"url" => "fotosuveniry-0-0"
"sitemap" => 1
"active" => 1
"position" => 0
]
}
+query: ParameterBag {#1920 ▶}
+server: ServerBag {#1679 ▶}
+files: FileBag {#1728 ▶}
+cookies: ParameterBag {#1727 ▶}
+headers: HeaderBag {#1886 ▶}
#content: null
#languages: null
#charsets: null
#encodings: null
#acceptableContentTypes: null
#pathInfo: null
#requestUri: null
#baseUrl: null
#basePath: null
#method: null
#format: null
#session: null
#locale: null
#defaultLocale: "en"
}
I need to get request->parameters as $_POST on Category.php (Request::all())
How to cause the action of another component and pass it parameters as when submitting the form?
That's what I need from Kohana http://kohanaframework.org/3.3/guide/kohana/requests#external-requests
This uses POST
$request = Request::factory('http://example.com/post_api')- >method(Request::POST)->post(array('foo' => 'bar', 'bar' => 'baz'));
Answer:
Input::merge($this->prepare_category($row->toArray()));
before
$request = Request::create('/admin/category', 'POST');
Route::dispatch($request);