如何从 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的主要内容,如果未能解决你的问题,请参考以下文章