IIS 中的 Blazor 服务器端下载问题

Blazor Server-Side download issues in IIS

提问人:1moreLearner 提问时间:6/14/2021 最后编辑:Mister Magoo1moreLearner 更新时间:6/17/2021 访问量:425

问:

我正在尝试下载文件列表(用户可以选择多个)。我下面的当前代码在 localhost 中运行良好(编写并打开下载文件夹)。但是,当我上传到IIS时,它给出一个错误,说找不到系统配置。 请看以下内容:

if (SelectDownloadFiles.Count > 0)
{
    //Downloads folder (User profile)
    string DownloadFolder = Environment.ExpandEnvironmentVariables("%userprofile%/downloads/");

    //This is a little hack to get the literal path for the Downloads folder without too much of back-and-forth and ellaboration
    string FolderForward = DownloadFolder.Replace(@"/", @"\");
    string Folder = FolderForward.Replace(@"\\", @"\");

    foreach (var items in SelectDownloadFiles)
    {
        //Get Date
        var GetDate = items.Substring(0, 6);

        //Add 2 days to be consistent to what is displayed to the user (when files were generated)
        var FileDate = DateTime.ParseExact(GetDate, "yyMMdd", CultureInfo.InvariantCulture).AddDays(2);

        //Get Files
        string Pathname = @"D:\";
        string FullPathName = Path.Combine(Pathname, items);
        byte[] FileBytes = System.IO.File.ReadAllBytes(FullPathName);
        MemoryStream Ms = new MemoryStream(FileBytes);

        //Rename the file to become user friendly
        string DownloadPath = Path.Combine(DownloadFolder, "My Files " + FileDate.ToString("MM-dd-yyyy") + ".zip");

        //Write file(s) to folder
        FileStream File = new FileStream(DownloadPath, FileMode.Create, FileAccess.Write);
        Ms.WriteTo(File);
        File.Close();
        Ms.Close();
    }

    //Open Downloads Folder with files
    Process.Start("explorer.exe", Folder);
    navigationManager.NavigateTo("/default", true);

    //DisplayMessage.Show("File(s) successfully downloaded. Please check your “Downloads” folder to access your file(s).", "OK", "check");
}
else
{
    Toaster.Add("Please select at least one file to download.", MatToastType.Warning);
}

我也尝试使用以下解决方案,但无济于事:

 private readonly IWebHostEnvironment _webHostEnvironment;

    public YourController (IWebHostEnvironment webHostEnvironment)
    {
        _webHostEnvironment= webHostEnvironment;
    }

例如,如果我使用“folderoptionpath”并选择“MyDocuments”,则文件将下载到IIS中文件的根路径。 我还需要做些什么才能做到这一点吗? 提前致谢!

C# IIS Blazor 服务器端

评论

0赞 6/15/2021
若要让 Web 应用程序在服务器上本地创建文件,必须注意权限。一种方法是创建一个“临时”目录(不在 wwwroot 中),并为IIS_IURS用户(或应用程序池中定义的其他用户)添加对此文件夹的读写权限。然后更改您的代码以在此目录中上传文件。
0赞 1moreLearner 6/15/2021
@GuyatMercator,写入用户的下载文件夹怎么样?这是一种选择吗?
0赞 ADyson 6/15/2021
问题是这段代码根本没有“下载”任何东西。它只是将文件系统写入它正在执行的机器。当您在本地进行测试并且客户端和服务器恰好是同一台设备时,这很好。正如你所发现的,当你将服务器移动到另一台机器时,它就会被解开。在普通的 Web 应用中,您实际需要做的是准备一个包含文件数据和相应 http 标头的 http 响应,以便浏览器将其视为下载而不是页面。在 blazor 中,我承认我不太确定最好的方法,但肯定不是你现在的方式。
0赞 ADyson 6/15/2021
P.s. stackoverflow.com/questions/52683706/...可能是你需要的

答:

1赞 1moreLearner 6/17/2021 #1

好吧,在花了一些时间研究这个问题之后,我终于能够让它开始了。我最终使用了一个名为 BlazorFileSaver 的 Nuget 包,它工作得很好。这是回购: https://github.com/IvanJosipovic/BlazorFileSaver/blob/master/src/BlazorFileSaver.Sample/Pages/Index.razor 我希望这能在未来帮助其他人。