php - subir - ¿Cómo obtener la ruta del archivo usando la fachada de almacenamiento en laravel 5?




subir y descargar archivos en laravel (8)

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


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);

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' => '[email protected]',
    ]);

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


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();




flysystem