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

时间:2009-10-29 13:28:42

标签: asp.net-mvc view

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

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

        return View();
}

但是如何返回mp3文件?

7 个答案:

答案 0 :(得分:9)

像这样创建一个Action:

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

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

答案 1 :(得分:3)

您应该返回FileResult而不是ViewResult:

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

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

答案 2 :(得分:2)

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

public ActionResult Stream()
{
    return Redirect("test.mp3");
}

答案 3 :(得分:1)

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

菲尔·哈克(Phil Haack)做了一个ActionResult来做这件事,称为DownloadResult。这是article

结果语法如下所示:

public ActionResult Download() 
{
  return new DownloadResult 
    { VirtualPath="~/content/mysong.mp3", FileDownloadName = "MySong.mp3" };
}

答案 4 :(得分:1)

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"));

        }

答案 5 :(得分:0)

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

答案 6 :(得分:0)

为什么不使用Filepathresult?

像这样:

        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") %>