web-dev-qa-db-fra.com

Comment obtenir le chemin du fichier en utilisant Storage façade dans laravel 5?

J'ai déjà expérimenté l'utilisation de la nouvelle intégration Flysystem avec Laravel 5. Je stocke les chemins "localisés" dans la base de données et je fais en sorte que la façade Stockage l'achève. Par exemple, je stocke screenshots/1.jpg et utilise

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

ou

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

Je peux récupérer le même fichier sur différents disques.

get récupère le contenu du fichier, mais j'espère pouvoir l'utiliser dans mes vues comme ceci:

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

mais path, ou tout ce qui est capable de récupérer le chemin complet, n'est pas disponible (pour autant que je puisse voir). Alors, comment puis-je retourner le chemin complet? Ou, je me demande si c'est par conception? Si oui, pourquoi ne suis-je pas censé pouvoir obtenir le chemin complet? Ou est-ce que j'y vais complètement de la mauvaise façon?

64
daviestar

Edit: Solution pour L5.2 +

Il existe une solution meilleure et plus simple.

Utilisez Storage::url($filename) pour obtenir le chemin d'accès complet/l'URL d'un fichier donné. Notez que vous devez définir S3 comme système de fichiers de stockage dans config/filesystems.php: 'default' => 's3'.

Bien sûr, vous pouvez aussi faire Storage::disk('s3')->url($filename) de la même manière.

Comme vous pouvez le voir dans config/filesystems.php, il existe également un paramètre 'cloud' => 's3' défini, qui fait référence au système de fichiers Cloud. Si vous souhaitez conserver le dossier de stockage sur le serveur local mais récupérer/stocker des fichiers dans le cloud, utilisez Storage::cloud(), qui utilise également les mêmes méthodes de système de fichiers, à savoir Storage::cloud()->url($filename).

La documentation de Laravel ne mentionne pas cette méthode, mais si vous souhaitez en savoir plus à ce sujet, vous pouvez vérifier son code source ici .

44
pj.martorell

Le chemin d'accès à votre disque de stockage serait:

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

Je ne connais aucune solution plus courte à cela ...

Vous pouvez partager le $ storagePath avec vos vues, puis simplement appeler

$storagePath."/myImg.jpg";
134
shock_gone_wild

Cette méthode existe depuis Laravel 5.4, vous pouvez l'obtenir par:

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

Voici comment je l'ai fait fonctionner: basculer entre les chemins de répertoire s3 et locaux avec une variable d'environnement, en passant le chemin à toutes les vues.

En .env:

APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID

Dans config/filesystems.php:

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

Dans l'application/Fournisseurs/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('/');
}
8
daviestar

Commencez par récupérer le fichier url/link puis le chemin, comme ci-dessous:

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

Eh bien, il y a des semaines, j'ai posé une question très similaire ( Obtenir l'URL du CDN depuis le fichier téléchargé via Storage ): Je voulais que l'URL du CDN affiche l'image à mon avis (selon vos besoins).

Cependant, après avoir examiné l'API du package, j'ai confirmé qu'il n'y avait aucun moyen de faire cette tâche. Donc, ma solution était d'éviter d'utiliser flysystem. Dans mon cas, je devais jouer avec RackSpace. Alors, décidez enfin de créer mon package d’utilisation et de créer mon propre package de stockage en utilisant Le PHP SDK pour OpenStack .

De cette manière, vous avez un accès complet aux fonctions dont vous avez besoin, comme getPublicUrl(), afin d’obtenir l’URL publique à partir d’un conteneur 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 conclusion, si vous devez prendre le service de stockage à un autre niveau, alors flysystem ne suffit pas. À des fins local, vous pouvez essayer la solution de @ nXu

3
manix

Si vous avez besoin d'une URL absolue du fichier, utilisez le code ci-dessous:

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

Méthode de stockage:

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

Route:

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

Manette:

 public function getImage($filename)
    {
        $file = Storage::get($filename);

        return new Response($file, 200);
    }

Vue:

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

Si vous voulez seulement afficher le chemin de stockage (disque), utilisez ceci:

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

De plus, si cela vous intéresse, j’ai créé un package ( https://github.com/fsasvari/laravel-uploadify ) juste pour Laravel afin que vous puissiez utiliser tous ces champs sur Champs modèles éloquents:

$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();
2
fsasvari

Dans mon cas, j'ai créé une méthode séparée pour les fichiers locaux, dans ce fichier: src/Illuminate/Filesystem/FilesystemAdapter.php

    /**
 * 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');
    }
}

alors, je crée une requête d'extraction vers le framework, mais elle n'a pas encore été fusionnée dans le noyau principal: https://github.com/laravel/framework/pull/13605 Peut-être que quelqu'un fusionne celui-ci))

1
Ruslan Terekhov

Une autre solution que j'ai trouvée est la suivante:

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

Renverra l'URL avec le chemin de base des documents

1
Marc Garcia

Jetez un oeil à ceci: Comment utiliser storage_path () pour afficher une image dans laravel 4 . La même chose s'applique à Laravel 5:

Le stockage est destiné au système de fichiers et la majeure partie de celle-ci n'est pas accessible au serveur Web. La solution recommandée consiste à stocker les images quelque part dans le dossier public (qui est la racine du document), dans le public/screenshots/ par exemple. Ensuite, lorsque vous souhaitez les afficher, utilisez asset('screenshots/1.jpg').

1
nXu