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?
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 .
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";
Cette méthode existe depuis Laravel 5.4, vous pouvez l'obtenir par:
$path = Storage::disk('public')->path($filename);
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('/');
}
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);
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
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
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"/>
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();
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))
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
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')
.