gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 中的模拟

转载 作者:行者123 更新时间:2023-12-03 18:34:11 24 4
gpt4 key购买 nike

我有一个需要从安全位置读取文件的操作,因此我必须使用模拟来读取文件。

此代码有效:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult DirectDownload(Guid id)
{
if (Impersonator.ImpersonateValidUser())
{
try
{
var path = "path to file";
if (!System.IO.File.Exists(path))
{
return View("filenotfound");
}

var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "application/octet-stream", "FileName");
}
catch (Exception e)
{
Log.Exception(e);
}finally
{
Impersonator.UndoImpersonation();
}
}
return View("filenotfound");
}

上面代码的唯一问题是我必须将整个文件读入内存,而且我将处理非常大的文件,所以这不是一个好的解决方案。但是如果我替换这两行:
var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "application/octet-stream", "FileName");

有了这个:
return File(path, "application/octet-stream", "FileName");

它不起作用,我收到错误消息:

Access to the path 'c:\projects\uploads\1\aa2bcbe7-ea99-499d-add8-c1fdac561b0e\Untitled 2.csv' is denied.



我猜想使用带有路径的文件结果,当我已经“撤消”模拟时,尝试稍后在请求管道中打开文件。

请记住,模拟代码有效,因为我可以读取字节数组中的文件。我想做的是将文件流式传输到客户端。

知道如何解决这个问题吗?

提前致谢。

最佳答案

您可以尝试编写自定义 FilePathResult :

public class ImpersonatingFileResult : FilePathResult
{
public ImpersonatingFileResult(string fileName, string contentType)
: base(fileName, contentType)
{ }

protected override void WriteFile(HttpResponseBase response)
{
// TODO : Start impersonation
response.TransmitFile(FileName);
// TODO : Rollback impersonation
}
}

并在您的 Controller 中:
return new ImpersonatingFileResult(path, "application/octet-stream");

关于asp.net-mvc - ASP.NET MVC 中的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2645302/

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