我在c#
中编写了以下代码行 private void DownloadFile(byte[] myData, string Name)
{
Response.Expires = 0;
Response.Clear();
string ext= System.IO.Path.GetExtension(Name);
switch(ext)
{
case ".mp3":
Response.ContentType = "audio/mpeg";
break;
default:
Response.ContentType = "Application/octet-stream";
break;
}
Response.AddHeader("content-length", myData.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + Name);
try
{
Response.BinaryWrite(myData);
}
catch { }
Response.Flush();
Response.End();
}
现在的问题是每当我们点击mp3文件下载时,都会直接播放。我希望它应该下载它。我还想要下载所有类型的文件。
答案 0 :(得分:0)
由于您不希望浏览器解释此数据,因此实用选项可能只是将所有数据作为“application / octet-stream”发送,而不管内容如何。虽然“附件”处理应该足够,但这种方法在RFC 2616,19.5.1(“内容处置”)中明确提出:
如果在带有application / octet-stream内容类型的响应中使用此标头,则隐含的建议是用户代理不应显示响应,而是直接输入“save response as ...”对话框。
答案 1 :(得分:0)
我在这方面挣扎的时间最长,但终于解决了这个难题。使用Response.WriteFile。您可以使用Response.Flush跟随它,但我发现这是不必要的。 .mp3文件不需要额外的标头。在我的例子中,.mp3文件位于根目录下的文件夹中。这里有一个额外的好处:使.mp3下载与智能手机一起使用的关键因素(这是我的两难选择)使用了Response.End,并告诉移动设备下载是通过发回Response.StatusCode =来完成的。 200。
string FilenameMP3 = "~/someFolder/xyz.mp3";
string headerFilename = Filename.Substring(Filename.IndexOf("/") + 1);
Response.AppendHeader("Content-Disposition", String.Concat("attachment;filename=\"", headerFilename, "\""));
Response.ContentType = "audio/mpeg";
try
{
Response.WriteFile(Filename, true);
Response.End();
}
finally
{
Response.StatusCode = 200;
Response.Close();
}