Reputation: 328
My problem is that i upload a image on the website in laravel but the database save the path of my local storage with a strange name and extension:
The picture was uploaded fine in Storage/app/public but with another name (Like a hash code):
Now, how can get this name in /Storage/Public with a query on a database, or how can upload the image with the original name or by ID?
Code: Form upload:
<form class="formulario" method="POST" enctype='multipart/form-data' action="{{ route('add_taller') }}">
@csrf
<h4>Añade el titulo correspondiente</h4><input name="titulo">
<h4>Añade un logo al taller</h4><input type="file" name="icono" class="taller_form {{ $errors->has('name') ? 'alert alert-danger' : ''}}" />
{!! $errors->first('image', '<p class="alerta">:message</p>') !!}
<h4>Añade una descripción</h4><textarea name="descripcion" rows="10" cols="50" value="{{ old('textarea') }}"></textarea>
{!! $errors->first('string', '<p class="alerta">:message</p>') !!}
<button type="submit">Subir a la web</button>
</form>
In controller:
public function add_taller(Request $request)
{
$request->file('icono')->store('public');
$user = Auth::user();
DB::table('talleres')->insert([
'icono' =>$request->icono,
'titulo' => $request->titulo,
'descripcion' => $request->descripcion,
'user_id' => $user->id,
'fecha'=> now()]);
return view('home');
}
View where I need to show the picture:
@foreach($datos as $dato)
<div class="taller">
<div>
<img src="{{Storage::url($dato->icono)}}" alt="" srcset="" class="icon_taller">
</div>
<div>
<h4>{{$dato->titulo}}</h4>
<p>{{$dato->descripcion}}</p>
</div>
<div class="botones_area">
<button>Descarga</button>
<button>Contacto</button>
</div>
</div>
@endforeach
Upvotes: 0
Views: 1142
Reputation: 1181
As I can see, you don't save the path with the file extension.
When you use $request->file('icono')->store('public');
you generate a temporal file and the file extension is determined by Laravel with the MIME type.
What's about:
public function add_taller(Request $request)
{
$path = Storage::putFileAs(
'public', $request->file('icono'), Str::uuid()
);
$user = Auth::user();
DB::table('talleres')->insert([
'icono' => $path,
'titulo' => $request->titulo,
'descripcion' => $request->description,
'user_id' => $user->id,
'fecha'=> now()]
);
return view('home');
}
For the filename, I've used Str::uuid function to generate names with a different id. For store files, I've used Storage Laravel facade, take a quick look here: https://laravel.com/docs/8.x/filesystem#specifying-a-file-name
What do you think about these changes?
Upvotes: 1