3

我在页面上有一个指向 MP3 文件的锚链接。Right-click + Save Target As..我希望能够通过单击链接下载此文件。

目前,我面临一个问题,即不同的浏览器有不同的行为。IE 以 WMP 播放文件,Firefox 提示下载框,Chrome 开始内联播放文件。单击时的预期行为是浏览器应该下载文件或给我一个下载对话框。

我试过以下:

  • 在页面上创建一个隐藏iframe并将其作为我的锚链接的目标,还尝试使用我想要的 MP3 文件位置创建一个表单作为其在此内部的操作,iframe并在锚链接单击事件上提交表单
  • window.location = MP3 URL链接点击设置
  • 尝试了多种组合window.open

这些都无法帮助我。我只是无法在链接单击时获得下载对话框。

无辜的锚链接看起来像:

<a id="someID" href="myMP3file" target="whatever" title="Download" class="someClass">Download Me!</a>
4

3 回答 3

1

只是为了发布正确答案的开始。我想我会使用 http 处理程序 (.ashx) 文件来为这些文件编写一些自定义处理 - 本教程显示了一个示例。

您的链接将类似于

<a href="MyMp3Handler.ashx?fileName=MyFile">Click here to download</a>

处理程序将完成流式传输工作。

处理程序的外观示例(基于此SO question

public void ProcessRequest (HttpContext context) {

    var filePath = Server.MapPath(context.Request.QueryString["fileName"].ToString()) + ".mp3";          
    if (!File.Exists(filePath))             
        return;          

    var fileInfo = new System.IO.FileInfo(filePath);         
    Response.ContentType = "application/octet-stream";         
    Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", filePath));         
    Response.AddHeader("Content-Length", fileInfo.Length.ToString());         
    Response.WriteFile(filePath);         
    Response.End();
}

处理程序还需要在 web.config 中注册。

但请注意 - 这不是我的想法,所以代码需要调整才能工作。只是想我会弹出我将如何开始

附加说明

一位同事刚刚指出,即使将内容类型设置为application/octet-stream它仍然取决于浏览器实现如何呈现它,因此它仍然可能不会流式传输。也就是说,我做了类似的事情,但在 PHP 中,我在 Firefox、IE 和 Chrome 中得到了 mp3 文件,所以这个原理确实有效。我在 asp.net 中提供了示例,因为这就是您的问题被标记的内容。

于 2012-05-09T13:29:17.940 回答
1

@CrabBucket - 这是我解决问题的方法!!对我来说效果很好:) 我正在使用控制器操作从该服务器端启动此下载(这就是我没有使用处理程序的原因)。从控制器返回一个 http 响应最初似乎很棘手,但后来我想出了一种方法来欺骗这个东西;)我不得不在我的控制器操作中编写以下代码 -

{
    HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(FileURL);
    HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();

    Stream myStream = myResponse.GetResponseStream();

    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", "attachment; filename=\"SaveMe.MP3\"");

    var readBytes = 10000000;
    var myAudResponse = new byte[readBytes];
    int fileLength;
    do {
        fileLength = myStream.Read(myAudResponse, 0, (int)readBytes);
        Response.OutputStream.Write(myAudResponse, 0, fileLength);
        Response.Flush();
    } while (fileLength > 0);
    myStream.Close();

    return new EmptyResult();
}

根据您的智慧使用基本的 Try-Catch 等 :) 非常感谢各种网络论坛以及 CrabBucket(您发布代码的 SO 问题,有一个非常有帮助的答案!)没有说!


抱歉多次修改!我的代码失败了一会儿。我想,循环总是要走的路!!!

于 2012-05-11T17:51:19.903 回答
0

您可以简单地使用锚标记的“下载”属性。

<a href='your_link' download='file_name'>Download_ME!</a>

这对我和个人都有效,我更喜欢坚持使用提供的任何默认自定义。

于 2020-10-22T03:47:21.770 回答