gpt4 book ai didi

c# - Web API 下载锁文件

转载 作者:太空狗 更新时间:2023-10-30 00:38:56 25 4
gpt4 key购买 nike

我在使用 WebAPI 方法时遇到一个小问题,该方法会在用户调用该方法的路由时下载文件。

方法本身很简单:

public HttpResponseMessage Download(string fileId, string extension)
{
var location = ConfigurationManager.AppSettings["FilesDownloadLocation"];
var path = HttpContext.Current.Server.MapPath(location) + fileId + "." + extension;

var result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(path, FileMode.Open);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}

该方法按预期工作 - 我第一次调用它。文件已传输,我的浏览器开始下载文件。

但是 - 如果我从我自己的计算机或任何其他计算机再次调用相同的 URL - 我会收到一条错误消息:

The process cannot access the file 'D:\...\App_Data\pdfs\test-file.pdf' because it is being used by another process.

此错误会持续大约一分钟 - 然后我可以再次下载文件 - 但只能下载一次 - 然后我必须再等一分钟左右,直到文件解锁。

请注意,我的文件相当大 (100-800 MB)。

我的方法中是否遗漏了什么?似乎流将文件锁定了一段时间或类似的时间?

谢谢:)

最佳答案

因为你的文件被第一个流锁定了,你必须指定一个FileShare允许它被多个流打开:

public HttpResponseMessage Download(string fileId, string extension)
{
var location = ConfigurationManager.AppSettings["FilesDownloadLocation"];
var path = HttpContext.Current.Server.MapPath(location) + fileId + "." + extension;

var result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}

就像你允许多个流以只读方式打开这个文件。

参见 MSDN documentation在构造函数重载上。

关于c# - Web API 下载锁文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com