如何从 ASP.NET MVC 控制器操作流式传输 MP3

Posted

技术标签:

【中文标题】如何从 ASP.NET MVC 控制器操作流式传输 MP3【英文标题】:How to stream an MP3 from an ASP.NET MVC Controller Action 【发布时间】:2009-10-29 13:28:41 【问题描述】:

我的站点中有一个 mp3 文件。我想将其输出为视图。 在我的控制器中,我有:

public ActionResult Stream()

        string file = 'test.mp3';
        this.Response.AddHeader("Content-Disposition", "test.mp3");
        this.Response.ContentType = "audio/mpeg";

        return View();

但是我该如何返回 mp3 文件呢?

【问题讨论】:

【参考方案1】:

像这样创建一个动作:

public ActionResult Stream(string mp3)
    byte[] file=readFile(mp3);
    return File(file,"audio/mpeg");

函数 readFile 应该从文件中读取 MP3 并将其作为 byte[] 返回。

【讨论】:

有没有办法流式传输部分文件?我有一个巨大的音频文件需要流式传输。我需要将它部分加载给用户,而他可以播放、停止、搜索等,并且整个文件还没有下载到客户端。【参考方案2】:

如果您的 MP3 文件位于用户可以访问的位置(即在某处的网站文件夹中),您可以简单地重定向到该 mp3 文件。使用控制器上的 Redirect() 方法来完成此操作:

public ActionResult Stream()

    return Redirect("test.mp3");

【讨论】:

【参考方案3】:

您应该返回 FileResult 而不是 ViewResult:

 return File(stream.ToArray(), "audio/mpeg", "test.mp3");

stream 参数应该是来自 mp3 文件的文件流或内存流。

【讨论】:

【参考方案4】:

您不想创建视图,而是想将 mp3 文件作为 ActionResult 返回。

Phil Haack 为此创建了一个 ActionResult,称为 DownloadResult。这是article。

生成的语法如下所示:

public ActionResult Download() 

  return new DownloadResult 
     VirtualPath="~/content/mysong.mp3", FileDownloadName = "MySong.mp3" ;

【讨论】:

【参考方案5】:
public FileResult Download(Guid mp3FileID)
        
            string mp3Url = DataContext.GetMp3UrlByID(mp3FileID);

            WebClient urlGrabber = new WebClient();
            byte[] data = urlGrabber.DownloadData(mp3Url);
            FileStream fileStream = new FileStream("ilovethismusic.mp3", FileMode.Open);

            fileStream.Write(data, 0, data.Length);
            fileStream.Seek(0, SeekOrigin.Begin);

            return (new FileStreamResult(fileStream, "audio/mpeg"));
            //return (new FileContentResult(data, "audio/mpeg"));

        

【讨论】:

【参考方案6】:

您应该创建自己的继承自 ActionResult 的类,here 是提供图像的示例。

【讨论】:

【参考方案7】:

为什么不使用文件路径结果?

像这样:

        public FilePathResult DownLoad()
    
        return new FilePathResult(Url.Content(@"/Content/01.I Have A Dream 4'02.mp3"), "audio/mp3");
    

并创建下载链接:

<%=html.ActionLink("Download the mp3","DownLoad","home") %>

【讨论】:

以上是关于如何从 ASP.NET MVC 控制器操作流式传输 MP3的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.Net MVC 中实现视频文件流式传输?

如何使用 ASP.NET Core 进行流式传输

Spring-MVC:如何从控制器流式传输 mp3 文件

如何从 ASP.NET MVC 控制器返回 Ajax“失败”?

将 excel 文件从 MVC 5 控制器流式传输到浏览器

如何在asp.net mvc中将数据从视图传递到控制器