Readdy Write  
0,00 €
Your View Money
Views: Count
Self 20% 0
Your Content 60% 0

Users by Links 0
u1*(Content+Views) 10% 0
Follow-Follower 0
s2*(Income) 5% 0

Count
Followers 0
Login Register as User

Asp.Core: User-Files in externes Verzeichnis auslagen außerhalb des Projekts

21.07.2021 (👁15940)


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"

});