如何通过Web服务返回文件

时间:2009-08-16 13:07:51

标签: ajax web-services content-disposition

我正在开发一个Web服务,用户可以在其中输入参数,并可以选择以各种文件格式(xml,html(屏幕),csv等)返回数据。

如果服务器生成文件内容(因此没有实际文件),则不能选择将URL返回给文件。那么怎么做呢?我知道有一些xml属性表明元素中的数据是二进制的,但是这不会触发浏览器将数据下载为文件。

是否有一些与{/ 1}}相当的XML / Web服务?

非常相关的说明:

javascript / AJAX可以触发浏览器下载文件吗?我知道单独的js没有“生成”文件的能力(在某种意义上,浏览器会将字符串作为具有给定文件名的文件下载“但是如果ajax函数调用脚本并且脚本回复有标题设置为下载?

我会尝试最后一部分,但想知道是否有任何可靠信息。


更多详情:

首先,感谢所有回复的人。所有的答案都非常有用并具有教育意义。

我想我可能会尝试更多地解释一下这种情况,以便将所有评论/关注/建议结合起来。

我为内部员工网站管理项目。该项目主要涉及进度查看和修改。至少有4种不同的PHP脚本可以在MySQL DB中查询基本相同的数据。查询根据上下文略有不同。在一种情况下,它按照分配来提取每日时间表,在另一种情况下,它会查询整周的时间表并按人员分组。在另一个中,它仅查询一个人的每周时间表。在某些情况下,它会输出数据,例如每人每天或每天或每个位置的小时总数,而在其他情况下,它只会提供存储在数据库中的内容。

我开始对项目的某些方面感到内疚。显然,我可以将大量数据提取组合到一个包含的脚本中。我可能应该使用面向对象的PHP来处理结果。而且我更专注于使这个混乱工作,而不是确保数据安全可靠,并且DB的压力是最小的和优化的。我甚至不确定如何真正知道查询是否已优化。

除了上面提到的内疚之外,我真的开始感到困惑。在试图将事情搞砸的时候,我发现自己纠结在一个结,一个修复方法搞砸了一些工作正常的东西。

所以,我认为一个好的解决方案是创建一个Web服务,它可以简化整个过程,并迫使我有一个逻辑(一个API,甚至)获取数据的方式,对任何人都会更有用当我最终不是主要的开发者时,谁试图接管。此外,它可以使整个事物更加便携,对于站点后端的升级和转换(有一天它可能在使用Cold Fusion的Windows服务器上,但我对此感到不寒而栗)以及可能想要连接的其他软件与数据库。

但这就是问题:

这个项目的全部起源是基于我们之前的调度解决方案是上传由我们使用的非常昂贵的企业级调度软件生成的非常丑陋和非语义的HTML报告这一事实。我们对这个可怕的HTML报告以及生成它的软件所面临的首要问题是,我们无法将Content Disposition“icalendar”文件导入到Outlook或Google日历中。我的个人使命是找出一种方法来转换那些可怕的报告INTO ics文件,从而开始讲述我为什么开始学习PHP,正则表达式和MySQL的故事。

所以,如果您还没有感到无聊和睡着,我认为Web服务是简化和简化计划流程的最佳选择,但如果我最终必须使用普通的PHP / MySQL来获取最有价值的部分数据(日历文件)然后我倾向于抛弃整个事情并继续解开结。

顺便说一句,我确实理解使用Web Service的脚本可以创建ics文件,并且当用户请求时,可以简单地避免使用AJAX。再次,感谢所有让我更清楚的事情。我只是希望Web服务尽可能地处理数据库返回的所有内容,以便在HTML / JS / PHP和数据库之间有一个清晰的分区。

再次感谢!

6 个答案:

答案 0 :(得分:3)

要让浏览器下载文件,您可以执行以下操作:

window.location = "http://example.com/webservice-file-url";

并使用标题:

Content-Disposition: attachment; filename="filename.ext"

如果您希望用户在屏幕上观看和下载之间进行选择,只需使用条件:

if (requested_format == 'html') {
    //get an html version and show it on screen
    ajaxRequestForHTML();
} else {
    //download the file
    window.location = "http://example.com/webservice-file-url";
}

答案 1 :(得分:0)

我担心这不起作用。 AJAX调用不会将其响应标头传递给浏览器。如果更改标题,唯一可以的是您的AJAX调用可能会失败,因为标题将无法识别。

我看到的唯一解决方案是将URL返回到文件并打开将触发下载的新JS窗口。

答案 2 :(得分:0)

从Web服务返回一个字节数组。如果您想将文件发送到服务,也是如此。

答案 3 :(得分:0)

在典型的浏览器环境中,JavaScript(出于安全原因)无法访问剪贴板或文件系统。有关讨论,请参阅clipboard-image-directly-save-in-to-client-side-using-javascriptsimilar questions

有例外,例如can-javascript-access-a-filesystem

答案 4 :(得分:0)

Web服务的关键在于它们不是由浏览器直接访问 - 它们是其他Web应用程序要使用的API。因此,您应该编写一个用户友好的前端,它调用Web服务并将数据作为HTTP响应中的文件提供。这将触发浏览器将其作为文件下载。

答案 5 :(得分:0)

您确定要将其作为网络服务吗?普通网页怎么样,带有参数的表单字段,只是将数据作为文件返回,具有适当的内容处理?


根据您的更新,我非常确定您不希望Web服务返回.ics文件。你想要的是一个脚本,它将使用查询字符串接受一些参数,然后使用“附件”内容处置返回文件。这将导致提示用户打开.ics文件。

现在,您还可以重构几个类似的脚本以减少冗余和维护。但是,我很关心你对每一个改变某些事情所说的话。在开始重构之前,您需要自己构建一个小型测试套件,最好是自动化的。这样,你可以在每次小改动后运行测试,看看你是否还有任何破坏。这样,当你打破某些东西时,你只能打破一个小时的价值。

我建议使用包含的脚本或PHP重用的任何机制重构PHP脚本(我不知道PHP)。然后,您可能会发现某些公共代码将作为Web服务正确实现。