【问题标题】:How to stream an MP3 from an ASP.NET MVC Controller Action如何从 ASP.NET MVC 控制器操作流式传输 MP3
【发布时间】: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 文件呢?

【问题讨论】:

    标签: asp.net-mvc view


    【解决方案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") %>
              

              【讨论】:

                猜你喜欢
                • 2018-08-29
                • 1970-01-01
                • 2021-06-13
                • 2018-04-28
                • 2018-05-17
                • 2013-10-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多