Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés
Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.
Figyelmeztetés
A ASP.NET Core ezen verziója már nem támogatott. További információ: .NET és .NET Core támogatási szabályzat. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .
Ez a cikk bemutatja, hogyan tölthet le fájlokat Blazor alkalmazásokban.
Fájlletöltések
Ez a cikk a következő forgatókönyvek megközelítéseit ismerteti, ahol egy fájlt nem szabad megnyitnia egy böngészőnek, hanem le kell töltenie és mentenie az ügyfélen:
- Fájltartalmak streamelése nyers bináris adatpufferbe az ügyfélen: Ez a módszer általában viszonylag kis méretű fájlokhoz (< 250 MB) használható.
- Fájl letöltése url-címről streamelésinélkül: Ez a módszer általában viszonylag nagy fájlokhoz (> 250 MB) használható.
Ha az alkalmazástól eltérő forrásból tölt le fájlokat, a CORS (Cross-Origin Resource Sharing) szempontokat figyelembe kell venni. További információ: lásd a Forrásközi erőforrás-megosztás (CORS) szakaszt.
Biztonsági szempontok
Legyen óvatos, amikor lehetőséget biztosít a felhasználóknak fájlok letöltésére egy kiszolgálóról. A kiberbűnözők Szolgáltatásmegtagadási (DoS) támadásokat hajthatnak végre, API-kihasználási támadásokat, vagy más módon próbálhatják meg feltörni a hálózatokat és a kiszolgálókat.
A sikeres támadás valószínűségét csökkentő biztonsági lépések a következők:
- Fájlok letöltése dedikált fájlletöltő területről a kiszolgálón, lehetőleg nem rendszermeghajtóról. A dedikált hely használatával egyszerűbb biztonsági korlátozásokat bevezetni a letölthető fájlokra. Tiltsa le a fájlletöltési területen a végrehajtási engedélyeket.
- A rosszindulatú felhasználók könnyen megkerülhetik az ügyféloldali biztonsági ellenőrzéseket. Mindig végezzen ügyféloldali biztonsági ellenőrzéseket a kiszolgálón is.
- Ne fogadjon fájlokat a felhasználóktól vagy más nem megbízható forrásokból, majd tegye elérhetővé a fájlokat azonnali letöltésre anélkül, hogy biztonsági ellenőrzéseket végez a fájlokon. További információért lásd: Fájlok feltöltése ASP.NET Core.
Letöltés streamből
Ez a szakasz általában legfeljebb 250 MB méretű fájlokra vonatkozik.
A viszonylag kis méretű fájlok (< 250 MB) letöltésének ajánlott módszere a fájltartalom streamelése egy nyers bináris adatpufferbe az ügyfélen JavaScript (JS) interop. Ez a megközelítés olyan összetevők esetében hatékony, amelyek interaktív renderelési módot alkalmaznak, de statikus kiszolgálóoldali renderelést (statikus SSR) alkalmazó összetevőkre nem.
A viszonylag kis méretű fájlok (< 250 MB) letöltésének ajánlott módszere a fájltartalom streamelése egy nyers bináris adatpufferbe az ügyfélen JavaScript (JS) interop.
Figyelmeztetés
Az ebben a szakaszban ismertetett megközelítés beolvassa a fájl tartalmát egy JS ArrayBuffer-ba. Ez a módszer betölti a teljes fájlt az ügyfél memóriájába, ami ronthatja a teljesítményt. A viszonylag nagy fájlok (>= 250 MB) letöltéséhez javasoljuk, hogy kövesse a Letöltés URL-címről szakasz útmutatását.
A következő downloadFileFromStreamJS függvény:
- A megadott adatfolyamot beolvassa a
ArrayBuffer-ba. - Létrehoz egy
Blob-t, hogy körbefuttassa aArrayBuffer-et. - Létrehoz egy objektum URL-címét, amely a fájl letöltési címeként szolgál.
- Létrehoz egy
HTMLAnchorElement(<a>elem). - A fájl nevét (
fileName) és URL-címét (url) rendeli hozzá a letöltéshez. - Aktiválja a letöltést egy
clickesemény a horgonyelemen való elindításával. - Eltávolítja a horgonyelemet.
- Visszavonja az objektum URL-címét (
url)URL.revokeObjectURLmeghívásával. Ez fontos lépés annak érdekében, hogy a memória ne szivárogjon ki az ügyfélen.
<script>
window.downloadFileFromStream = async (fileName, contentStreamReference) => {
const arrayBuffer = await contentStreamReference.arrayBuffer();
const blob = new Blob([arrayBuffer]);
const url = URL.createObjectURL(blob);
const anchorElement = document.createElement('a');
anchorElement.href = url;
anchorElement.download = fileName ?? '';
anchorElement.click();
anchorElement.remove();
URL.revokeObjectURL(url);
}
</script>
Megjegyzés
A JS helyére és az éles alkalmazásokkal kapcsolatos ajánlásainkra vonatkozó általános útmutatásért nézze meg a JavaScript-helyet az ASP.NET Core Blazor alkalmazásokban.
A következő összetevő:
- Natív byte-streaming interop használatával biztosítja a fájl hatékony átvitelét az ügyfélnek.
- Van egy
GetFileStreamnevű metódus, amely egy Stream-et kér le az ügyfelekhez letöltött fájlhoz. Az alternatív módszerek közé tartozik egy fájl lekérése a tárolóból, vagy egy fájl dinamikus létrehozása C#-kódban. Ebben a bemutatóban az alkalmazás létrehoz egy 50 KB-os, véletlenszerű adatokat tartalmazó fájlt egy új bájttömbből (new byte[]). A bájtok egy MemoryStream-val vannak becsomagolva, hogy a példa dinamikusan előállított bináris fájljaként szolgáljanak. - A
DownloadFileFromStreammódszer:- Lekéri a Stream-t a
GetFileStream-ből. - Megadja a fájl nevét, amikor a fájl a felhasználó gépére van mentve. Az alábbi példa a fájl
quote.txtnevet adja. - Becsomagolja a Stream-t egy DotNetStreamReference-be, amely lehetővé teszi a fájladatok továbbítását a kliensnek.
- Meghívja a
downloadFileFromStreamJS függvényt az ügyfél adatainak elfogadásához.
- Lekéri a Stream-t a
FileDownload1.razor:
@page "/file-download-1"
@using System.IO
@inject IJSRuntime JS
<PageTitle>File Download 1</PageTitle>
<h1>File Download Example 1</h1>
<button @onclick="DownloadFileFromStream">
Download File From Stream
</button>
@code {
private Stream GetFileStream()
{
var randomBinaryData = new byte[50 * 1024];
var fileStream = new MemoryStream(randomBinaryData);
return fileStream;
}
private async Task DownloadFileFromStream()
{
var fileStream = GetFileStream();
var fileName = "log.bin";
using var streamRef = new DotNetStreamReference(stream: fileStream);
await JS.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
}
}
@page "/file-download-1"
@using System.IO
@inject IJSRuntime JS
<PageTitle>File Download 1</PageTitle>
<h1>File Download Example 1</h1>
<button @onclick="DownloadFileFromStream">
Download File From Stream
</button>
@code {
private Stream GetFileStream()
{
var randomBinaryData = new byte[50 * 1024];
var fileStream = new MemoryStream(randomBinaryData);
return fileStream;
}
private async Task DownloadFileFromStream()
{
var fileStream = GetFileStream();
var fileName = "log.bin";
using var streamRef = new DotNetStreamReference(stream: fileStream);
await JS.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
}
}
@page "/file-download-1"
@using System.IO
@inject IJSRuntime JS
<h1>File Download Example</h1>
<button @onclick="DownloadFileFromStream">
Download File From Stream
</button>
@code {
private Stream GetFileStream()
{
var randomBinaryData = new byte[50 * 1024];
var fileStream = new MemoryStream(randomBinaryData);
return fileStream;
}
private async Task DownloadFileFromStream()
{
var fileStream = GetFileStream();
var fileName = "log.bin";
using var streamRef = new DotNetStreamReference(stream: fileStream);
await JS.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
}
}
@page "/file-download-1"
@using System.IO
@inject IJSRuntime JS
<h1>File Download Example</h1>
<button @onclick="DownloadFileFromStream">
Download File From Stream
</button>
@code {
private Stream GetFileStream()
{
var randomBinaryData = new byte[50 * 1024];
var fileStream = new MemoryStream(randomBinaryData);
return fileStream;
}
private async Task DownloadFileFromStream()
{
var fileStream = GetFileStream();
var fileName = "log.bin";
using var streamRef = new DotNetStreamReference(stream: fileStream);
await JS.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
}
}
Egy szerveroldali alkalmazás azon komponense, amelynek vissza kell adnia egy fizikai fájl Stream értékét, hívhatja meg a File.OpenRead-et, ahogy azt az alábbi példa mutatja:
private Stream GetFileStream() => File.OpenRead(@"{PATH}");
Az előző példában a {PATH} helyőrző a fájl elérési útja. A @ előtag azt jelzi, hogy a sztring egy szó szerinti sztringkonstans, amely lehetővé teszi a fordított perjelek (\) használatát egy Windows operációs rendszer elérési útján, és beágyazott dupla idézőjeleket ("") egyetlen idézőjelhez az elérési úton. Alternatív megoldásként kerülje a karakterlánc-literált (@), és használja az alábbi módszerek egyikét:
- Használjon kettős visszaperjeleket (
\\) és idézőjeleket (\"). - Használjon perjeleket (
/) az útvonalban, amelyeket az ASP.NET Core-alkalmazások platformjai támogatnak, valamint escapelt idézőjeleket (\").
Letöltés URL-címről
Ez a szakasz a viszonylag nagy, jellemzően 250 MB-os vagy nagyobb fájlokra vonatkozik.
A viszonylag nagy méretű fájlok (>= 250 MB) interaktív módon renderelt összetevőkkel vagy statikusan renderelt összetevőkhöz tetszőleges méretű fájlokkal való letöltésének ajánlott módszere a JS használata a fájl nevével és URL-címével rendelkező horgonyelem aktiválására.
A viszonylag nagy méretű fájlok (>= 250 MB) letöltésének ajánlott módszere, hogy a JS segítségével aktiválják a fájl nevével és URL-címével rendelkező horgonyelemet.
A jelen szakaszban szereplő példa egy quote.txtnevű letöltési fájlt használ, amely egy files nevű mappába kerül az alkalmazás webgyökerében (wwwroot mappában). A files mappa használata csak szemléltetés céljából történik. A letölthető fájlokat a kívánt webes gyökérmappán (wwwroot mappán) belül bármilyen mappaelrendezésben rendszerezheti, beleértve a fájlok közvetlenül a wwwroot mappából való kiszolgálását is.
wwwroot/files/quote.txt:
When victory is ours, we'll wipe every trace of the Thals and their city from the face of this land. We will avenge the deaths of all Kaleds who've fallen in the cause of right and justice and build a peace which will be a monument to their sacrifice. Our battle cry will be "Total extermination of the Thals!"
- General Ravon (Guy Siner, http://guysiner.com/)
Dr. Who: Genesis of the Daleks (https://www.bbc.co.uk/programmes/p00vd5g2)
Copyright 1975 BBC (https://www.bbc.co.uk/)
When victory is ours, we'll wipe every trace of the Thals and their city from the face of this land. We will avenge the deaths of all Kaleds who've fallen in the cause of right and justice and build a peace which will be a monument to their sacrifice. Our battle cry will be "Total extermination of the Thals!"
- General Ravon (Guy Siner, http://guysiner.com/)
Dr. Who: Genesis of the Daleks (https://www.bbc.co.uk/programmes/p00vd5g2)
Copyright 1975 BBC (https://www.bbc.co.uk/)
When victory is ours, we'll wipe every trace of the Thals and their city from the face of this land. We will avenge the deaths of all Kaleds who've fallen in the cause of right and justice and build a peace which will be a monument to their sacrifice. Our battle cry will be "Total extermination of the Thals!"
- General Ravon (Guy Siner, http://guysiner.com/)
Dr. Who: Genesis of the Daleks (https://www.bbc.co.uk/programmes/p00vd5g2)
Copyright 1975 BBC (https://www.bbc.co.uk/)
When victory is ours, we'll wipe every trace of the Thals and their city from the face of this land. We will avenge the deaths of all Kaleds who've fallen in the cause of right and justice and build a peace which will be a monument to their sacrifice. Our battle cry will be "Total extermination of the Thals!"
- General Ravon (Guy Siner, http://guysiner.com/)
Dr. Who: Genesis of the Daleks (https://www.bbc.co.uk/programmes/p00vd5g2)
Copyright 1975 BBC (https://www.bbc.co.uk/)
A következő triggerFileDownloadJS függvény:
- Létrehoz egy
HTMLAnchorElement(<a>elem). - A fájl nevét (
fileName) és URL-címét (url) rendeli hozzá a letöltéshez. - Aktiválja a letöltést egy
clickesemény a horgonyelemen való elindításával. - Eltávolítja a horgonyelemet.
<script>
window.triggerFileDownload = (fileName, url) => {
const anchorElement = document.createElement('a');
anchorElement.href = url;
anchorElement.download = fileName ?? '';
anchorElement.click();
anchorElement.remove();
}
</script>
Megjegyzés
A JS helyére és az éles alkalmazásokkal kapcsolatos ajánlásainkra vonatkozó általános útmutatásért nézze meg a JavaScript-helyet az ASP.NET Core Blazor alkalmazásokban.
Az alábbi példaösszetevő az alkalmazás által használt forrásból tölti le a fájlt. Ha a fájlletöltést egy másik forrásból kíséreli meg, konfigurálja a forrásközi erőforrás-megosztást (CORS). További információ: lásd a Forrásközi erőforrás-megosztás (CORS) szakaszt.
FileDownload2.razor:
@page "/file-download-2"
@inject IJSRuntime JS
<PageTitle>File Download 2</PageTitle>
<h1>File Download Example 2</h1>
<button @onclick="DownloadFileFromURL">
Download File From URL
</button>
@code {
private async Task DownloadFileFromURL()
{
var fileName = "quote.txt";
var fileURL = "/files/quote.txt";
await JS.InvokeVoidAsync("triggerFileDownload", fileName, fileURL);
}
}
Interaktív összetevők esetén az előző példa gombja meghívja a DownloadFileFromURL kezelőt a JavaScript (JS) függvény meghívására triggerFileDownload.
Ha az összetevő statikus kiszolgálóoldali renderelést (statikus SSR) alkalmaz, adjon hozzá egy eseménykezelőt a gombhoz (addEventListener) a triggerFileDownload meghívásához, követve a ASP.NET Core Blazor JavaScript statikus kiszolgálóoldali rendereléssel (statikus SSR) iránymutatásait.
@page "/file-download-2"
@inject IJSRuntime JS
<PageTitle>File Download 2</PageTitle>
<h1>File Download Example 2</h1>
<button @onclick="DownloadFileFromURL">
Download File From URL
</button>
@code {
private async Task DownloadFileFromURL()
{
var fileName = "quote.txt";
var fileURL = "/files/quote.txt";
await JS.InvokeVoidAsync("triggerFileDownload", fileName, fileURL);
}
}
Interaktív összetevők esetén az előző példa gombja meghívja a DownloadFileFromURL kezelőt a JavaScript (JS) függvény meghívására triggerFileDownload.
Ha az összetevő statikus kiszolgálóoldali renderelést (statikus SSR) alkalmaz, adjon hozzá egy eseménykezelőt a gombhoz (addEventListener) a triggerFileDownload meghívásához, követve a ASP.NET Core Blazor JavaScript statikus kiszolgálóoldali rendereléssel (statikus SSR) iránymutatásait.
@page "/file-download-2"
@inject IJSRuntime JS
<h1>File Download Example 2</h1>
<button @onclick="DownloadFileFromURL">
Download File From URL
</button>
@code {
private async Task DownloadFileFromURL()
{
var fileName = "quote.txt";
var fileURL = "https://localhost:5001/files/quote.txt";
await JS.InvokeVoidAsync("triggerFileDownload", fileName, fileURL);
}
}
Módosítsa az előző példában szereplő portot a környezet localhost fejlesztői portjának megfelelőre.
@page "/file-download-2"
@inject IJSRuntime JS
<h1>File Download Example 2</h1>
<button @onclick="DownloadFileFromURL">
Download File From URL
</button>
@code {
private async Task DownloadFileFromURL()
{
var fileName = "quote.txt";
var fileURL = "https://localhost:5001/files/quote.txt";
await JS.InvokeVoidAsync("triggerFileDownload", fileName, fileURL);
}
}
Módosítsa az előző példában szereplő portot a környezet localhost fejlesztői portjának megfelelőre.
Forrásközi erőforrás-megosztás (CORS)
Ha nem szeretné engedélyezni forrásközi erőforrás-megosztást (CORS) olyan fájlok esetében, amelyek nem azonosak az alkalmazással, a fájlok letöltése nem felel meg a böngésző által végzett CORS-ellenőrzéseknek.
További információ a CORS-ról ASP.NET Core-alkalmazásokkal és más, letöltésre fájlokat üzemeltető Microsoft-termékekkel és szolgáltatásokkal kapcsolatban:
- Forrásközi kérelmek (CORS) engedélyezése ASP.NET Core
- Az Azure CDN használata CORS-sel (Azure-dokumentáció)
- forrásközi erőforrás-megosztás (CORS) támogatása az Azure Storage -hoz (REST dokumentáció)
- Alapvető felhőszolgáltatások – A CORS beállítása a webhelyhez és a tárolóeszközökhöz (Learn modul)
- IIS CORS-modul konfigurációs referencia (IIS-dokumentáció)
További erőforrások
- ASP.NET Core Blazor statikus fájlok
- ASP.NET Core Blazor JavaScript-együttműködés (JS interop)
- JavaScript-hely ASP.NET Core Blazor-alkalmazásokban
- ASP.NET Core Blazor JavaScript statikus kiszolgálóoldali rendereléssel (statikus SSR)
-
<a>: A Horgony elem: Biztonság és adatvédelem (MDN-dokumentáció) - ASP.NET Core Blazor fájl feltöltések
-
Blazor GitHub-adattár mintái (
dotnet/blazor-samples) (hogyan lehet letölteni)