簡體   English   中英

使用ASP.NET Core下載文件

[英]Download file using ASP.NET Core

創建文件后,我嘗試下載excel文件,但出現以下錯誤:

UnauthorizedAccessException:拒絕訪問路徑“ C:\\ Users \\用戶名\\ Documents \\ Visual Studio 2015 \\ Projects \\ Project_Name \\ src \\ Project_Name \\ wwwroot”。

文件創建成功,問題出在下載方法中。

我已經嘗試執行以下操作來解決此錯誤:

  • 以管理員身份打開VS
  • 將IIS_IUSR用戶添加到項目文件夾

這是代碼:

    private readonly IHostingEnvironment _hostingEnvironment;
    public EmployeeController(ApplicationDbContext context, IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }
    public void createFile()
    {
        string wwwrootPath = _hostingEnvironment.WebRootPath;
        string fileName = @"Employees.xlsx";
        FileInfo file = new FileInfo(Path.Combine(wwwrootPath, fileName));

        if (file.Exists)
        {
            file.Delete();
            file = new FileInfo(Path.Combine(wwwrootPath, fileName));
        }
        using (ExcelPackage package = new ExcelPackage(file))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Employee");
            worksheet.Cells[1, 1].Value = "ID";
            worksheet.Cells[1, 2].Value = "Name";
            worksheet.Cells[1, 3].Value = "Gender";
            worksheet.Cells[1, 4].Value = "Salary (in $)";

            worksheet.Cells["A2"].Value = 1000;
            worksheet.Cells["B2"].Value = "Jon";
            worksheet.Cells["C2"].Value = "M";
            worksheet.Cells["D2"].Value = 5000;

            worksheet.Cells["A3"].Value = 1001;
            worksheet.Cells["B3"].Value = "Graham";
            worksheet.Cells["C3"].Value = "M";
            worksheet.Cells["D3"].Value = 10000;

            worksheet.Cells["A4"].Value = 1002;
            worksheet.Cells["B4"].Value = "Jenny";
            worksheet.Cells["C4"].Value = "F";
            worksheet.Cells["D4"].Value = 5000;

            package.Save(); 
            downloadFile(wwwrootPath);

        }  

}
    public FileResult downloadFile(string filePath)
    {
        var mimeType = "application/vnd.ms-excel";
        FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);

        return File(fileStream, mimeType, "Employees.xlsx");
    }

注意:我沒有在IIS中進行項目的部署。

最好的祝福

在ASP.NET Core中,應使用PhysicalFileProvider類訪問實際系統的文件。 如果您查看文檔中的“ 文件提供者”部分:

PhysicalFileProvider提供對物理文件系統的訪問。 它包裝System.IO.File類型(用於物理提供程序),對目錄及其子目錄的所有路徑進行范圍界定。 這種作用域限制了對某個目錄及其子目錄的訪問,從而阻止了對該邊界之外文件系統的訪問。

以下應該為您工作:

string wwwrootPath = _hostingEnvironment.WebRootPath;
string fileName = @"Employees.xlsx";

IFileProvider provider = new PhysicalFileProvider(wwwrootPath);
IFileInfo fileInfo = provider.GetFileInfo(fileName);
var readStream = fileInfo.CreateReadStream();

// PhysicalFileProvider.GetFileInfo返回的實例PhysicalFileInfo提供實現IFileInfo.CreateReadStream方法。

我測試了您的代碼,錯誤消失了,但是文件沒有被下載。 這是代碼:

public FileResult downloadFile(string filePath, string fileName)
{
        IFileProvider provider = new PhysicalFileProvider(filePath);
        IFileInfo fileInfo = provider.GetFileInfo(fileName);
        var readStream = fileInfo.CreateReadStream();
        var mimeType = "application/vnd.ms-excel";
        return File(readStream, mimeType, fileName);
}

最好的祝福

我在代碼中注意到了兩種情況。 1-如果直接在按鈕中調用下載方法,則會進行下載,但是文件存儲在localhost目錄中,例如http:// localhost:3724 / Area / Controller / downLoadMethod 我希望瀏覽器打開下載框,然后選擇存儲文件的位置。

2-如果在我的按鈕中調用了exportMethod,而在exportMethod的內部調用了downloadMethod,則在文件導出后我只會得到一個空白頁,則不會進行下載。

最好的祝福

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM