30-1 Dossier de fichiers partagé
Jusqu'à maintenant, nous avons fait abstraction des images dans le projet d'API/Blazor. La raison est que les images des événements sont stockées dans le dossier wwwroot
du projet MVC
.
Lorsqu'on fait référence à un fichier, la recherche se fait dans le dossier wwwroot
du projet actif. Or, il n'est pas possible d'accéder au dossier wwwroot
d'un autre projet.
Donc, dans le projet client et API, il est impossible de faire référence au dossier wwwroot
du projet MVC
pour récupérer les images d'événement. Même si c'était possible, cela ne ferait pas tellement de sens de toute façon.
Les fichiers devraient être stockés dans un endroit neutre pouvant être accédé par les différentes portions de notre application. À la limite, on devrait pouvoir changer de technologie, sans impact sur le stockage de fichiers et d'images.
Nous allons concevoir une solution générique de stockage de fichiers. Elle sera utilisée pour les images dans notre cas, mais pourrait être utilisée pour d'autres types de fichiers au besoin.
Créer un dossier Storage
sous la solution
Afin de stocker les fichiers, nous allons créer un dossier Storage
. Ce dossier sera un dossier classique sans particularité. On créera ce dossier sous la solution. Ainsi, pour ce faire, **vous devrez être en mode File System
dans Rider.
- Assurez-vous de basculer du mode
Solution
au modeFile System
dans Rider. - Sous la solution
Snowfall
->Add
->Directory
- Nommez le dossier
Storage
À noter que le nom pourrait être différent, il s'agit d'identifier clairement que le dossier servira au stockage de fichiers pour l'application.
Déplacer les images dans le dossier Storage
Maintenant, à partir du projet MVC
, déplacez vos fichiers d'images à la racine du dossier Storage
. Ne copiez pas le dossier evenements
, seulement les fichiers.
Vous devriez avoir quelque chose comme ceci:
Mettre à jour le projet MVC
Vous pouvez partir le projet MVC
et malheureusement, puisque les images ont été déplacées, les images associées ne s'affichent plus.
Il faudra faire quelques légères modifications afin de pouvoir récupérer les images en provenance du dossier Storage
Ajouter le dossier partagé Storage
comme provider
de fichiers
On doit dire à l'application, soit le projet MVC
dans ce cas, d'utiliser le dossier partagé Storage
comme une source de fichiers.
Dans le fichier program.cs
du projet MVC
, ajoutez UseStaticFiles
afin de créer un PhysicalFileProvider
:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.GetFullPath(Path.Combine(builder.Environment.ContentRootPath, "..", "Storage"))),
RequestPath = "/storage"
});
new PhysicalFileProvider
crée une nouvelle source de fichiers statiquesPath.GetFullPath(Path.Combine(builder.Environment.ContentRootPath, "..", "Storage")))
indique le chemin vers cette source de fichiers, soit le dossierStorage
dans le projetSnowfall.Shared
à partir de la racine du projetRequestPath
indique à partir de quelleURL
de base des fichiers seront accessibles. On aurait pu utiliser/fichiers
,/files
, etc.
Modifier le chemin vers les images dans les vues
Il ne reste qu'à modifier le chemin vers les images dans les vues où nous voulons afficher des images.
Par exemple, dans la vue partielle _Evenement
:
<img class="card-evenement img-fluid rounded-top object-fit-cover" src="~/storage/@Model.ImagePath"/>
Plutôt que de faire référence à ~/images/evenements/@Model.ImagePath
, on utilise le nouveau dossier via ~/storage/@Model.ImagePath
.
/storage
est traité comme un dossier faisant partie de wwwroot
même si physiquement ce n'est pas le cas. Il s'agit d'un genre de dossier virtuel.
Vous devriez voir les images s'afficher.
Utiliser appsettings.json
Pour stocker la référence au fichier Storage
, il est une bonne pratique de mettre la référence dans le fichier appsettings.json
.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"AppDatabaseConnection" : "Server=localhost;Database=snowfall;User Id=postgres;Password=admin;Include Error Detail=true;"
},
"DossierStorage": "../Storage"
}
Ensuite, on utilise cette propriété dans Program.cs
/ UseStaticFiles
:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.GetFullPath(Path.Combine(builder.Environment.ContentRootPath, builder.Configuration["DossierStorage"]!))),
RequestPath = "/storage"
});
Appliquer les configurations au projet d'API
On appliquera la même configuration au projet d'API (serveur) afin que ce dernier puisse utiliser le dossier de fichiers partagés.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"AppDatabaseConnection" : "Server=localhost;Database=snowfall;User Id=postgres;Password=admin;Include Error Detail=true;"
},
"DossierStorage": "../Storage"
}
Ensuite, ajoutez une autre entrée UseStaticFiles
à celle existante:
// Blazor
app.UseBlazorFrameworkFiles();
app.UseStaticFiles()
.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.GetFullPath(Path.Combine(builder.Environment.ContentRootPath, builder.Configuration["DossierStorage"]!))),
RequestPath = "/storage"
});
Test
Assurez-vous que vos images du projet MVC s'affichent correctement, nous poursuivrons avec le projet d'API / Blazor dans les prochains niveaux.