0

初步结论这很可能是安装的浏览器(ie9)的本地副本是问题所在。相同的解决方案文件版本在另一位开发人员的计算机上工作。我将在星期一重新安装我的浏览器。我认为浏览器要么已损坏,要么已更改设置。当我运行以前版本的源代码控制时,同样的问题早在成为问题之前就出现了。

开发服务器上的版本(非本地副本)实际上适用于我的浏览器,但它在响应标头中将我的浏览器识别为“Mozilla 4/ie7 兼容”。但是,我的本地副本将我的浏览器识别为“Mozilla 5/ie9 compatible”,当/如果本地浏览器被确认为问题时,我将进一步更新此问题。(这个问题可能不再对任何人相关或有帮助,但我们可以稍等片刻关闭它 - 如果它提前关闭也没关系,因为解决方案可能过于本地化而无法帮助任何人)


原文

Ie9 无法下载我的文件,浏览器会收到它,但不会向用户显示它。

它仍然可以在 infirefox 中运行,但最近当我让我的页面使用 ajax 时,它在 ie9 中出现了问题。

我的控制器的一些代码如下

    public ActionResult FileDownload(string id)
    {
          //[ommitted some code]                      
          var fp = FileProvider.GetFileContentFromDisk( fileLocInfo.FilePath);
          var stream = new MemoryStream( fp.Data );
          return File( stream, fp.MimeType, fileLocInfo.FileName );
    }

文件已发送,但无法显示下载

啊,问题是我可以使用什么代码来向用户提供可在旧版浏览器中运行的文件以供下载。

我试过 Context.Reponse.BinaryWrite(),但它会在窗口中打开文件并且不提供下载。至少这不是沉默。

编辑 我怀疑我正在使用的东西正在使结果静音。我将开始研究插件和我添加的东西。

我尝试了以下答案的几种排列,但在我可用的两种浏览器中都没有任何效果。HttpContext.Response.AddHeader("Content-Disposition", "attachent;filename =" + fileLocInfo.FileName ); return File(stream.ToArray(), "application/force-download" , fileLocInfo.FileName ); 结果 - Firefox“内容损坏错误”失败

HttpContext.Response.ContentType = "application/octet-stream";
HttpContext.Response.AddHeader("Content-Disposition", "attachent;filename =" + fileLocInfo.FileName );
return File(stream.ToArray(), "application/force-download" , fileLocInfo.FileName );

结果 - 在浏览器中显示文件 ie。(不可下载),firefox =“损坏的内容错误”

HttpContext.Response.ContentType = "application/force-download"; ////"application/octet-stream";
HttpContext.Response.AddHeader("Content-Disposition", "attachent;filename =" + fileLocInfo.FileName );
return File(stream.ToArray(), fp.MimeType , fileLocInfo.FileName );

结果 - 在浏览器中显示文件 ie。(不可下载),firefox =“损坏的内容错误”

public FileContentResult FileDownload(string id)
return File(stream.ToArray(), fp.MimeType , fileLocInfo.FileName );

结果-在ie中保持沉默。(未显示),提供在 Firefox 中下载

public FileStreamResult FileDownload(string id)
return File(stream, fp.MimeType , fileLocInfo.FileName );

结果 - 在 ie 中保持沉默

其他想法:如果我从 Repsonse 对象进行二进制写入,我可以让两者都显示在浏览器中(虽然不是下载)。它很烦人。

感谢您的回答,但我认为这个问题可能特定于我的解决方案。

4

2 回答 2

3

您需要设置 HTTP 标头,以便它知道应该保存而不只是显示在浏览器中。

Content-Type: application/octet-stream
Content-Disposition:  attachment; filename=DefaultFileNameHere.txt

由于您将 ActionResult 与 File 响应一起使用,您只需更改方法签名,它就会自动为您添加处置:

public FileContentResult  FileDownload(String id) {....}
于 2013-06-14T20:11:29.370 回答
1

尝试将内容类型设置为application/force-download.

return File(filePath, "application/force-download", fileName);

这个问题可能是What content type to force download of text response?,其中谈到了@DMoses 提到的方法。

于 2013-06-14T20:11:31.260 回答