从MVC控制器获取FileStream到客户端

4

我使用下面的代码将文件流放入MVC控制器返回的响应消息中。但是,我如何在客户端获取流?任何评论都非常感谢!谢谢!

服务器:

string filename = @"c:\test.zip";

FileStream fs = new FileStream(filename, FileMode.Open);

HttpResponseMessage response = new HttpResponseMessage();

response.Content = new StreamContent(fs);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

return response;

你可能需要重新措辞你的问题,比如说,“如何使用.NET从服务器下载文件”。也许这个链接可以帮到你:https://msdn.microsoft.com/zh-cn/library/ez801hhe(v=vs.110).aspx - Rosdi Kasim
2个回答

8
如果您只是想下载二进制数据,应该使用FileContentResult类型或FileStreamResult类型,可以通过Controller类上的File方法访问。

以下是一个简单的示例:
string filename = @"c:\test.zip";

var bytes = System.IO.File.ReadAllBytes(filename);

return File(bytes, "application/octet-stream", "whatevernameyouneed.zip");

你可能需要添加代码来确保文件存在等。如果你好奇,你也可以阅读MSDN上关于ReadAllBytes方法的说明。
在你的WebForms项目中,你可以很容易地读取这个控制器的响应。
var client = new HttpClient();
var response = await client.GetAsync("protocol://uri-for-your-MVC-project");

if(response.IsSuccessStatusCode)
{
    // Do *one* of the following:

    string content = await response.Content.ReadAsStringAsync();
    // do something with the string

    // ... or ...

    var bytes = await response.Content.ReadAsByteArrayAsync();
    // do something with byte array

    // ... or ...

    var stream = await response.Content.ReadAsStreamAsync();
    // do something with the stream

}

你读取响应的方式取决于你自己;由于你并没有真正描述客户端站点应该如何处理你正在读取的文件,因此很难更具体地说明。


1
你比我快了 :) 这是FileContentResult的MSDN文档: https://msdn.microsoft.com/zh-cn/library/system.web.mvc.filecontentresult(v=vs.118).aspx - Eraph
不确定您所说的“客户端”是什么意思?控制器操作将返回一个八位字节流,通常会在用户的浏览器中导致下载提示。 - Tieson T.
1
那么你的客户端是另一个ASP.NET应用程序?这是问题中遗漏的一个重要部分。 - Tieson T.
抱歉,应该要独立一点,因为我猜我的工作前端人员不喜欢用 ASP.NET 做前端,但我只需要制作一个简单的工作前端。所以最终选择了 ASP.NET。 - Ronald
是的,我知道如何访问控制器(uri),我在WebForms客户端项目上得到了响应,但我不知道如何获取数据。因此,它可以是流、文件内容或文件内容结果...我感到困惑。在这个领域有点新。 - Ronald
显示剩余6条评论

3
如果您需要更强大的解决方案并对文件检索具有更多控制权,请使用以下内容:
/// <summary>
/// Returns a file in bytes
/// </summary>
public static class FileHelper
{
    //Limited to 2^32 byte files (4.2 GB)
    public static byte[] GetBytesFromFile(string fullFilePath)
    {

        FileStream fs = null;

        try
        {
            fs = File.OpenRead(fullFilePath);
            var bytes = new byte[fs.Length];
            fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
            return bytes;
        }
        finally
        {
            if (fs != null)
            {
                fs.Close();
                fs.Dispose();
            }
        }

    }
}

控制器:

    public FileResult DownloadPdf()
    {
        var filePath = Server.MapPath("~/Content/resume/BrentonBates_WebDev_Resume.pdf");
        var pdfFileBytes = FileHelper.GetBytesFromFile(filePath);
        return File(pdfFileBytes, "application/pdf", "Brenton Bates Business Application Developer.pdf");
    }

以下是可以参考的内容:http://www.mikesdotnetting.com/article/125/asp-net-mvc-uploading-and-downloading-files

希望这可以帮助到您...

也许您想要一个类似下面实现方式的实例:

string fileName = "test.zip";
string path = "c:\\temp\\";
string fullPath = path + fileName;
FileInfo file = new FileInfo(fullPath);

Response.Clear();
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.ContentType = "application/x-zip-compressed";
Response.WriteFile(fullPath);
Response.End();

谢谢,但是我在我的前端ASP页面上该怎么做呢? 我正在使用httpclient(至少我最好的猜测是这样),但是我该如何在那里获取字节、文件内容或流? 我想流应该是最好的解决方案,因为对内存的影响最小,对吗? - Ronald

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