【问题标题】:Browsers Not Showing File Was Downloaded浏览器未显示文件已下载
【发布时间】:2017-03-01 16:40:51
【问题描述】:

为了工作,我正在处理文件导出。数据全部导出正常,但令人担忧的是没有出现文件对话框,浏览器也没有指示文件已下载。

我的文件下载包含两个 ajax 处理程序和一些 javascript。 我的按钮有一个 onclick 事件,它调用generateReport,它将一个微调器放在页面上并调用一个处理程序。此处理程序准备数据并将其保存到文件中。

一旦完成,javascript 会调用第二个处理程序,该处理程序会检索保存的文件并将其发送给用户,并提示他们保存文件。调用第二个处理程序并且不会引发错误。

我的第二个(不工作的)处理程序在这里:

baseDir = ProjectConfig.BaseShareFolderPath
        Dim fileStream As FileStream = New FileStream((baseDir + "\" + filePath), FileMode.Open, FileAccess.Read)
        Dim bytes As Byte()
        Dim binaryReader As BinaryReader = New BinaryReader(fileStream)

        bytes = binaryReader.ReadBytes(fileStream.Length)
        fileStream.Close()
        fileStream.Dispose()
        binaryReader.Close()

        Dim fileName As String = filePath.Substring(filePath.IndexOf("\Crm") + 1)
        context.Response.ContentType = "xls"
        context.Response.AppendHeader("content-disposition", "attachment;filename=" & fileName)
        context.Response.OutputStream.Write(bytes, 0, bytes.Length)
        context.Response.OutputStream.Flush()
        context.Response.OutputStream.Close()
        context.Response.End()

任何人都可以看到这不会通过文件对话框提示用户的任何原因吗?我们在其他项目中使用类似的代码,我的只是似乎缺少一些小块。

【问题讨论】:

  • 前端调用的是什么javascript代码?是通过 ajax 还是窗口重定向完成的?
  • 我还建议将 filePath.Substring(filePath.IndexOf("\Crm") + 1) 更改为 System.IO.Path.GetFileName(filePath)
  • 这是一个 ajax 调用,我会调查那个 GetFileName

标签: javascript vb.net asp.net-ajax


【解决方案1】:

无法使用 ajax 将文件下载到客户端计算机。

在您的 javascript 中,您需要使用 window.location.replace(downloadUrl)window.open(downloadUrl)。后者将打开一个新窗口下载文件,第一个将使用当前窗口执行下载。

供参考:Download a file by jQuery.Ajax

【讨论】:

  • 所以我必须制作一个带有一些 url 的不可见页面来下载文件?让 ajax 调用一个 window.open(url) 那么对于那个 url 在 Page_Load 方法中有我的处理程序逻辑吗?
  • 您可以将其指向您用于进行 ajax 调用的完全相同的 url,只要对该调用的响应是具有正确响应标头的文件。您无需使用新页面。
  • 我唯一的问题是我不是指向一个 url,而是指向磁盘上的路径。所以我让它返回正确的路径,它只是打开一个空白窗口。
  • 您的 javascript 无法直接访问您的 Web 服务器的磁盘路径。 ajax 调用必须使用 url,您可以将这部分 javascript 代码编辑到您的问题中吗?
  • 不幸的是,我没有指向这个特定文件夹的 url,但是创建了一个空页面,并在 Page_Load 方法中进行下载!
【解决方案2】:

您的 ContentType(MIME 类型)看起来不正确。试试这个:

context.Response.ContentType = "application/vnd.ms-excel"

【讨论】:

  • 不幸的是,这仍然没有任何作用。我的第一个处理程序将文件强制写入磁盘,这很好,但为什么使用第二个处理程序我不能抓取同一个文件并将其提供给用户?
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 2019-08-26
  • 2014-11-18
  • 1970-01-01
  • 2014-07-16
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多