簡體   English   中英

ASP.NET 核心 3.1 MVC 下載文件直到 IIS 應用程序池回收或從本地主機運行網站

[英]ASP.NET Core 3.1 MVC download file not found until IIS app pool recycle or run website from localhost

我正在運行 IIS 10 的 Microsoft 服務器上使用 Entity Framework 網站制作一個 ASP.NET Core 3.1 MVC,具有基本的用戶文件上傳和下載功能。 我可以將文件從 web 上傳到 _webHostEnvironment.WebRootPath,但是當我嘗試下載它們時找不到它們。 但是,如果我回收應用程序池,我可以下載該文件(我也可以在訪問服務器本地主機上的網站后從 web 下載它)。

這是我上傳文件時的代碼:

string uniqueFileName = null;
if (model.Data != null)
{
    string uploadsFolder = Path.Combine(_webHostEnvironment.WebRootPath, "images");
    uniqueFileName = Guid.NewGuid().ToString() + "_" + model.Data.FileName;
    string filePath = Path.Combine(uploadsFolder, uniqueFileName);
    model.Data.CopyTo(new FileStream(filePath, FileMode.Create));
}

這是我下載時的代碼:

public FileResult DownloadData(string fileName, string tempAddCode, string patientName)
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(Path.Combine(_webHostEnvironment.WebRootPath, "images") + "\\" + fileName);
    var dataStream = new MemoryStream(fileBytes);
    return new FileStreamResult(dataStream, new MediaTypeHeaderValue("application/pdf"))
    {
        FileDownloadName = patientName.ToLower().Replace(" ", "_") + ".pdf"
    };
}

到底是怎么回事? 為什么回收應用程序池可以解決這個問題? 我是否將這些用戶上傳的文件保存到錯誤的位置,而 ASP.NET 正在做某種緩存操作? 我很樂意幫助您找到解決方案。 謝謝。

如果在 DownloadData function 中放置斷點並單步執行,會發生什么情況? 它是否成功將文件讀入 fileBytes,或者您是否遇到異常 - 您遇到了什么異常? 請同時檢查 IIS 日志以獲取錯誤代碼並發布。

此外,請確保您正在運行的用戶對該文件夾具有寫入權限。 默認情況下,它不會。

要添加,請右鍵單擊文件夾、安全性,然后添加(從計算機)IIS AppPool\ [無論 appPool 名稱是什么]。

IIS AppPool\MyAppPool

使用這一行,您可以打開文件 stream 並且永遠不會關閉它。

model.Data.CopyTo(new FileStream(filePath, FileMode.Create));

確保你總是處理你的流,這樣文件就不會保持鎖定狀態。 使用下面的代碼將 stream 正確復制到文件

using (var fs = new FileStream(filePath, FileMode.Create))
{
    model.Data.CopyTo(fs);
}

暫無
暫無

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

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