Asp.Core: User-Files in externes Verzeichnis auslagen
ausserhalb des Projekts
Anleitung: Wie kann man User-Dateien aus einem Asp.Net Core
Projekt getrennt auslagern, damit das Asp.Core Code-Projekt wirklich physikalisch
getrennt ist von den echten User-Dateien.
User Dateien sind dynamischer Content, welcher von Web-Usern
erstellt wird. In der Regel sind es Upload von Fotos, Office Dokumenten, Videos
oder Code-Dateien
Asp.Net Core
3, .Net5
Beispiel:
Die Upload Fotos in der Web-Anwendung sollen in einen benachbarten
Ordner neben der Asp Core Anwendung ausgelagert werden.
Zum Auslagern von Verzeichnissen in Asp.Net Core 3 / .Net5 muss
man in der Startup-Datei die UseStaticFiles und den FileProvider erweitern.
Dann kann man im Controller die Dateien ausserhalb des Projekt-Verzeichnisses
ganz regulär mit dem physikalischen Pfad ansprechen und die HTML Ausgaben wiederum
wie ein Unterverzeichnis ansprechen.
1) Physikalischen
Verzeichnisse
Laden der
beim Init des Controllers
Beim Starten eines Controllers wird bei Asp.net Core 3+ über
das IWebHostEnvironment der physikalische Pfad zur Anwendung und zur wwwRoot
geladen
Physikalisches Verzeichnisse in: _hostingEnvironment
private readonly ApplicationDbContext _dbContext;
private readonly IWebHostEnvironment
_hostingEnvironment; //
public ArticlesController(ApplicationDbContext
dbContext, IWebHostEnvironment hostingEnvironment)
{
//----<
Init: Controller >----
_dbContext = dbContext;
_hostingEnvironment = hostingEnvironment;
//----</ Init: Controller >----
}
|
|
Name
|
Value
|
◢
|
hostingEnvironment
|
{Microsoft.AspNetCore.Hosting.HostingEnvironment}
|
|
ApplicationName
|
"CodeDocu"
|
|
▶ ContentRootFileProvider
|
{Microsoft.Extensions.FileProviders.PhysicalFileProvider}
|
|
ContentRootPath
|
"D:\\Programmierung\\Web\\CodeDocu\\CodeDocu"
|
|
EnvironmentName
|
"Development"
|
|
▶ WebRootFileProvider
|
{Microsoft.Extensions.FileProviders.CompositeFileProvider}
|
|
WebRootPath
|
"D:\\Programmierung\\Web\\CodeDocu\\CodeDocu\\wwwroot"
|
2) Angeben des physikalischen
Verzeichnisses für User Files
Controller
Actin
Der Pfad für den Upload von User Files wird meistens nur in einer
Controller action notwendig.
Der echte Pfad kann entweder direkt per String eingetragen
werden, oder wie hier in einem benachbarten Ordner des Parent-Folders definiert
werden.
//< init Upload Path >
//*get path to user files images folder
"D:\\Programmierung\\Web\\CodeDocu\\User_Files\\Articles\\Images\\
string sPath_Application =
_hostingEnvironment.ContentRootPath;
//folder
"D:\\Programmierung\\Web\\CodeDocu\\CodeDocu"
string sPath_Userfiles =
sPath_Application.Substring(0, sPath_Application.LastIndexOf("\\")); //parent folder
"D:\\Programmierung\\Web\\CodeDocu"
sPath_Userfiles =
Path.Combine(sPath_Userfiles, "User_Files"); //User files folder
"D:\\Programmierung\\Web\\CodeDocu\\User_Files\\Articles\\Images\\"
string path_for_Uploaded_Files =
Path.Combine(sPath_Userfiles, "Articles\\Images\\");
//< init Upload Path >
|
Server Zugriff auf externen User
Folder
Hier wird eine Datei im User_Folder als Beispiel eine
Bild-Datei definiert.
Diese kann dann ganz regulär mit System.IO.File zugegriffen
und bearbeitet werden.
Die Datei wird vom Server, der Web App bearbeitet, obwohl
diese auf einem übergeordneten Verzeichnis liegt.
Dabe ist der App-Code wirklich von den User-Dateien
getrennt.
//< Filename >
string image_webname = "Image_" + IDArticle + "_" + last_ImageNr + "." + sExtension;
string new_FullFilename_on_Server = Path.Combine(
path_for_Uploaded_Files, image_webname);
//</ Filename >
//< Copy File to Target >
if (System.IO.File.Exists(new_FullFilename_on_Server))
{ System.IO.File.Delete(new_FullFilename_on_Server); }
using (FileStream stream = new FileStream(new_FullFilename_on_Server,
FileMode.Create))
{
await
uploaded_file.CopyToAsync(stream);
}
//</ Copy File to Target >
//----< check Properties >----
Image originalImage =
Image.FromFile(new_FullFilename_on_Server);
if
(originalImage.PropertyIdList.Contains(0x0112))
|
Server Bearbeitung
von Dateien
Wie man in der Bearbeitung sieht, werden Fotos und Dateien
ohne Probleme in dem externen Ordner erstellt
Anzeige der User-Dateien im HTML Frontend
Die Dateien des /User_Files Verzeichnisses werden direkt mit
dem / Frontslash Zeichen angezeigt
<img src="/User_Files/Articles/Images/Image_2598_7_blog.jpg"
style="width: 100%; max-width: 100%; height: auto; display:
inline-block;">
Anpassung der Startup.cs
Damit der externe User_Files Ordner wie ein lokaler Pfad
angebunden wird, muss in der Asp.Net Core 3+ .Net5+ die UseStaticFiles
angepasst werden
In Startup.cs ->Configure(..)
app.UseStaticFiles(); //*path to: wwwroot, css, js, bootstrap
//*path to user content folder
// using
Microsoft.Extensions.FileProviders;
// using System.IO;
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new
PhysicalFileProvider(Path.Combine(env.ContentRootPath, "..\\User_Files")),
RequestPath = "/User_Files"
});
|