使用ASP.NET Core下载文件

6
我正在尝试在创建文件后下载Excel文件,但是我遇到了以下错误:
UnauthorizedAccessException:拒绝访问路径 'C:\ Users \ user_name \ 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中部署项目。
最好的问候。

Excel文件还打开着吗?如果您在其旁边放置一个fake.txt文件,您可以下载该文件吗? - mjwills
Excel文件还打开着吗?不是。 如果你在旁边放一个fake.txt文件,你能下载那个文件吗?不行,我无法下载该文件。VS指示此行存在问题: FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); - Vanilson Lourenço
3个回答

8
在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 方法的实现。


1

我测试了你的代码,错误已经消失了,但是文件没有被下载。这是代码:

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);
}

最好的祝福

0
我在我的代码中注意到了两种情况。 1-如果我直接在按钮中调用下载方法,下载就会发生,但文件存储在本地主机目录中,类似于http://localhost:3724/Area/Controller/downLoadMethod。我希望浏览器打开下载框,然后我选择存储文件的位置。
2-如果在我的按钮中调用exportMethod,并在exportMethod内部调用downloadMethod,在文件导出后,我只得到一个空白页面,下载不会发生。
此致敬礼

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接