subir simbolico link descargar crear archivos archivo almacenar php laravel-5 flysystem

php - simbolico - storage::disk laravel



¿Cómo obtener la ruta del archivo usando la fachada de almacenamiento en laravel 5? (12)

He estado experimentando usando la nueva integración de Flysystem con Laravel 5. Estoy almacenando rutas ''localizadas'' a la base de datos y obteniendo la fachada de Almacenamiento para completar la ruta. Por ejemplo, almaceno screenshots/1.jpg y uso

Storage::disk(''local'')->get(''screenshots/1.jpg'')

o

Storage::disk(''s3'')->get(''screenshots/1.jpg'')

Puedo recuperar el mismo archivo en diferentes discos.

get recupera el contenido del archivo, pero espero usarlo en mis vistas de esta manera:

<img src="{{ Storage::path(''screenshots/1.jpg'') }}" />

pero la ruta, o cualquier cosa capaz de recuperar la ruta completa no está disponible (por lo que puedo ver). Entonces, ¿cómo puedo devolver el camino completo? ¿O me pregunto si esto es por diseño? Si es así, ¿por qué no se supone que pueda obtener el camino completo? ¿O voy por esto completamente por el camino equivocado?


Así es como lo puse a trabajar: cambiar entre s3 y rutas de directorio locales con una variable de entorno, pasando la ruta a todas las vistas.

En .env:

APP_FILESYSTEM=local or s3 S3_BUCKET=BucketID

En config / filesystems.php:

''default'' => env(''APP_FILESYSTEM''),

En app / Providers / AppServiceProvider:

public function boot() { view()->share(''dynamic_storage'', $this->storagePath()); } protected function storagePath() { if(Storage::getDefaultDriver() == ''s3'') { return Storage::getDriver() ->getAdapter() ->getClient() ->getObjectUrl(env(''S3_BUCKET''), ''''); } return URL::to(''/''); }


Bueno, hace unas semanas hice una pregunta muy similar ( Obtener la URL de CDN del archivo cargado a través de Almacenamiento ): quería que la URL de CDN mostrara la imagen en mi opinión (como usted lo requiere).

Sin embargo, después de revisar la API del paquete, confirme que no hay forma de hacer esta tarea. Entonces, mi solución fue evitar el uso de flysystem . En mi caso, necesitaba jugar con RackSpace. Entonces, finalmente decido crear mi paquete de uso y crear mi propio paquete de almacenamiento usando The PHP SDK for OpenStack .

De esta manera, tiene acceso completo a las funciones que necesita, como getPublicUrl() para obtener la URL pública de un contenedor cdn:

/** @var DataObject $file */ $file = /OpenCloud::container(''cdn'')->getObject(''screenshots/1.jpg''); // $url: https://d224d291-8316ade.ssl.cf1.rackcdn.com/screenshots/1.jpg $url = (string) $file->getPublicUrl(UrlType::SSL);

En conclusión, si es necesario llevar el servicio de almacenamiento a otro nivel, entonces flysystem no es suficiente. Para fines local , puede probar la solución de @ nXu


Eche un vistazo a esto: Cómo usar storage_path () para ver una imagen en laravel 4 . Lo mismo se aplica a Laravel 5:

El almacenamiento es para el sistema de archivos, y la mayor parte no está accesible para el servidor web. La solución recomendada es almacenar las imágenes en algún lugar de la carpeta pública (que es la raíz del documento), en public/screenshots/ por ejemplo. Luego, cuando desee mostrarlos, use el asset(''screenshots/1.jpg'') .


En mi caso, hice un método separado para archivos locales, en este archivo: src / Illuminate / Filesystem / FilesystemAdapter.php

Storage::disk(''documents'')->getDriver()->getConfig()->get(''url'')

luego, creo una solicitud de extracción al marco, pero aún no se fusionó en el núcleo principal todavía: https://github.com/laravel/framework/pull/13605 Puede ser alguien que combine este))


Este método existe desde Laravel 5.4, puede obtenerlo de la siguiente manera:

$path = Storage::disk(''public'')->path($filename);


La ruta a su disco de almacenamiento sería:

$storagePath = Storage::disk(''local'')->getDriver()->getAdapter()->getPathPrefix()

No conozco soluciones más cortas para eso ...

Puede compartir el $ storagePath con sus Vistas y luego simplemente llamar

$storagePath."/myImg.jpg";


Método de almacenamiento:

public function upload($img){ $filename = Carbon::now() . ''-'' . $img->getClientOriginalName(); return Storage::put($filename, File::get($img)) ? $filename : ''''; }

Ruta:

Route::get(''image/{filename}'', [ ''as'' => ''product.image'', ''uses'' => ''ProductController@getImage'', ]);

Controlador:

public function getImage($filename) { $file = Storage::get($filename); return new Response($file, 200); }

Ver:

<img src="{{ route(''product.image'', [''filename'' => $yourImageName]) }}" alt="your image"/>


Otra solución que encontré es esta:

/** * Get the local path for the given filename. * @param $path * @return string */ public function localPath($path) { $adapter = $this->driver->getAdapter(); if ($adapter instanceof LocalAdapter) { return $adapter->getPathPrefix().$path; } else { throw new RuntimeException(''This driver does not support retrieving local path''); } }

Devolverá la url con la ruta base de los documentos Almacenamiento


Primero obtenga la url / enlace del archivo y luego la ruta, como se muestra a continuación:

$url = Storage::disk(''public'')->url($filename); $path = public_path($url);


Si necesita la URL absoluta del archivo, use el siguiente código:

$file_path = /Storage::url($filename); $url = asset($file_path); // Output: http://example.com/storage/filename.jpg


Si solo desea mostrar la ruta de almacenamiento (disco) use esto:

Storage::disk(''local'')->url(''screenshots/1.jpg''); // storage/screenshots/1.jpg Storage::disk(''local'')->url(''''): // storage

Además, si está interesado, creé un paquete ( https://github.com/fsasvari/laravel-uploadify ) solo para Laravel para que pueda usar todos esos campos en los campos de modelo Eloquent:

$car = Car::first(); $car->upload_cover_image->url(); $car->upload_cover_image->name(); $car->upload_cover_image->basename(); $car->upload_cover_image->extension(); $car->upload_cover_image->filesize();


Editar: Solución para L5.2 +

Hay una solución mejor y más directa.

Use Storage::url($filename) para obtener la ruta / URL completa de un archivo determinado. Tenga en cuenta que debe configurar S3 como su sistema de archivos de almacenamiento en config/filesystems.php : ''default'' => ''s3''

Por supuesto, también puede hacer Storage::disk(''s3'')->url($filename) de la misma manera.

Como puede ver en config/filesystems.php , también hay un parámetro ''cloud'' => ''s3'' definido, que se refiere al sistema de archivos Cloud. En caso de que desee mantener la carpeta de almacenamiento en el servidor local pero recuperar / almacenar algunos archivos en la nube, use Storage::cloud() , que también tiene los mismos métodos de sistema de archivos, es decir, Storage::cloud()->url($filename) .

La documentación de Laravel no menciona este método, pero si desea obtener más información al respecto, puede consultar su código fuente here .