Soy nuevo en Laravel y me preguntaba si alguien me puede ayudar con una simple carga de imágenes.
Tengo un formulario que le permite a un usuario crear un perfil y cargar un avatar para su perfil durante el proceso. Todo esto funciona perfectamente. Aquí está el código de mi controlador:
if (request()->hasFile('avatar')) { $file = request()->file('avatar'); $file->storeAs('avatars/' . auth()->id(), 'avatar.jpg'); }La imagen se guarda en storage/app/avatars/USER-ID/avatar.jpg
No estoy seguro de cómo mostrar la imagen de esta carpeta. He buscado soluciones, pero no puedo usar php artisan storage:link porque no es mi servidor. ¿Cómo hago esto sin usar el enlace de almacenamiento? ¿Puedo crear un enlace manualmente?
Si alguien pudiera explicarme una solución, ¡sería perfecto!
Solo pregunte si necesita fragmentos de código.
¡Gracias!
Deberá acceder a los archivos protegidos mediante una ruta de los enchufes a un controlador que pueda acceder a los archivos y pasarlos a la vista.
También recomendaría usar la intervention/image del paquete, puede ser instalado por
composer require intervention/image
Vea a continuación para acceder a la imagen:
// Tu ruta en web.php
// Public route to show user avatar Route::get('avatars/{id}/{image}', [ 'uses' => 'TheNameOfYourController@userProfileAvatar' ]); // En su archivo de controlador. En este ejemplo según el nombre de lo que tenemos arriba sería userProfileAvatar()
namespace App\Http\Controllers; use Illuminate\Http\Request; use Image; class TheNameOfYourController extends Controller { /** * Show user avatar * * @param $id * @param $image * @return string */ public function userProfileAvatar($id, $image) { return Image::make(storage_path() . '/avatars/' . $id . '/' . $image)->response(); } }// La vista de su hoja para mostrar la imagen
<img src="images/profile/{{ \Auth::user()->id }}/avatar.jpg" alt="{{ \Auth::user()->name }}">Aquí hay algunas referencias, pero estas instancias van un paso más allá y guardan la ruta del archivo en la base de datos al cargar:
// Ejemplo de ruta
// Ejemplo de controlador
// Ver ejemplos
Bueno, si no tiene acceso al servidor para crear un enlace simbólico, debe crear una ruta que devuelva la imagen como respuesta.
Algo como eso:
Route::get('storage/{filename}', function ($filename) { $path = storage_path('avatars/' . $filename); if (!File::exists($path)) { abort(404); } $file = File::get($path); $type = File::mimeType($path); $response = Response::make($file, 200); $response->header("Content-Type", $type); return $response; });Cree un enlace simbólico que conectará los directorios de storage/app y public/img , por ejemplo:
ln -s /home/laravel/public/img /home/laravel/storage/app Luego, solo use el asistente de asset() para generar un enlace:
<img src="{{ asset('img/avatars/'.auth()->id().'/avatar.jpg') }}">