【问题标题】:Working with big files in classic ASP在经典 ASP 中处理大文件
【发布时间】:2023-03-09 20:08:01
【问题描述】:

我想知道在经典 asp 中提供生成的大文件的最佳做法是什么。

我们有一个具有“导出到 excel”功能的应用程序,可以生成 10MB 的文件。只需调用 Response.ContentType 设置为 excel 并具有数据的 HTML 表的 .asp 页面即可创建 Excel。

这导致用户需要 4 分钟才能看到“另存为...”对话框。

我当前的解决方案是调用一个 .asp 页面,该页面使用 AJAX 在服务器上创建 excel,并让页面返回生成文档的 URL。然后我可以使用javascript在原始页面上显示。

使用经典的 asp(使用某种流在服务器上创建文件)很容易做到这一点,同时牢记安全性吗? (网址应该能让人们猜到其他文件的位置)

我将如何处理超时删除的生成文件?随着数据的实时变化,它们必须定期删除。

谢谢。

编辑:我现在意识到在服务器上创建文件可能也需要 4 分钟...

【问题讨论】:

  • 请编辑问题,说明您现在是如何生成 Excel 的,并说明在与“大”文件一起使用时会导致什么问题。
  • 完成,谢谢建议

标签: asp-classic


【解决方案1】:

当解决方案足够简单时,我认为您正在选择一条复杂的路线(尽管我可能会遗漏一些要求)

如果你要生成一个excel,只需调用一个asp页面,执行以下操作:

Response.clear
Response.AddHeader "content-disposition", "attachment; filename=myexcel.xls"
Response.ContentType = "application/excel"

'//write the content of the file
Response.write "...."

Response.end

这将在浏览器中启动下载过程,而无需生成额外的调用、javascript 或任何东西

请参阅this question,了解有关您将选择生成 excel 的格式的更多信息。

编辑

由于 Thomas 更新了问题,真正的问题是生成文件需要 4 分钟,因此解决方案可能是:

  1. 为用户提供通过电子邮件发送文件(如果这是在您的服务器或主机中可行的解决方案)。

  2. 异步生成文件,并在文件生成完成时通知用户(使用 ajax 调用,就像其他用户添加答案时那样)

在服务器上生成文件

'//You should change for a random name or something that makes sense
FileName = "C:\temp\myexcel.xls" 
FileNumber = FreeFile
Open FileName For Append As #FileNumber

'//generate the content
TheRow = "...."
Print #FileNumber, TheRow




Close #FileNumber

删除生成的临时文件
我使用Empty Temp Folders 一个免费软件应用程序,我每天在服务器上运行它来处理生成的临时文件。 (同样,这取决于您的服务器或主机)

关于安全
使用随机数或 GUId 生成文件以进行光保护。如果数据敏感,您需要从 ASP 页面下载文件,但我认为您将再次遇到同样的问题...(等待 4 分钟下载)

【讨论】:

  • 这就是我们目前的做法,但是在用户看到“另存为...”对话框弹出之前需要很长时间。服务器必须缓冲 4500 个 之前它可以为用户提供excel下载。这需要相当长的时间。
  • 但是您可能是对的,首先在服务器上生成文件不会提高速度。我并没有真正考虑过。
  • Thomas:在生成文件时不时使用 Response.flush 怎么样。它有什么不同吗? (我过去用过,但从来没有测试过它是否有什么不同)
  • 是响应缓冲区之类的东西吗?使用它会导致数据显示在常规浏览器窗口中,而不是在另存为对话框中提供..
  • +1 对于异步通知的一般概念。但是请注意,VBScript 没有 open 语句。 Scripting.FileSystemObject 或 ADODB.Stream 是在服务器端创建文件所需的工具。
【解决方案2】:
  1. 使用 FSO 读取文件。
  2. 为 Excel 文件类型设置标题,根据文件读取和下载名称设置标题(附件)
  3. 设置标头后刷新响应。客户端应显示“另存为”对话框。
  4. 输出 FSO 以响应。客户端将下载文件并查看进度条。

【讨论】:

    【解决方案3】:

    您打算如何生成 Excel?我希望您不打算调用 Excel 来执行此操作,因为它不受支持,并且通常无法正常工作。

    您应该检查是否有 COM 组件可以生成可以从 Classic ASP 调用的 Excel。或者,为此目的添加一个 ASP.NET 页面。我知道有一个可以从 ASP.NET 页面调用的组件来执行此操作。更糟糕的是,Infragistics 提供了一个 Excel 导出器组件,可与他们的 UltraWebGrid 控件一起导出。为了实现这一点,网格不需要可见,但网格中的样式会转换为电子表格中的样式。它们还允许您以编程方式操作电子表格。

    【讨论】:

    • John:使用 ASP 经典(或其他任何东西)非常容易生成开放格式的 XML excel 文件。我认为您使事情复杂化了一点。
    • 请注意,我问他将如何创建 Excel。我无法假设他会将其生成为 XML,尤其是因为我看到人们尝试通过 COM 调用 Excel 来做到这一点!
    • 我目前正在通过 HTML 表格并在 excel 上设置 response.contenttype。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签