【问题标题】:How to implement Play2 API server returning File via Ajax?如何通过 Ajax 实现 Play2 API 服务器返回文件?
【发布时间】:2015-11-14 21:25:23
【问题描述】:

我正在使用 Scala Play2 框架并尝试将 SVG 字符串数据转换为其他文件类型,例如 PDF、PNG、JPEG 并将其作为文件发送给客户端。

我想要实现的是

  1. 客户端通过 Ajax 发送数据(带有非常大的 JSON 的 POST)
  2. 服务器从 JSON 生成一个文件
  3. 服务器将文件返回给客户端。

但似乎发送文件并让客户端将其保存为静态文件几乎是不可能的,所以我计划根据客户端请求制作新的静态文件并将其访问 url 返回到客户端并通过 Javascript 打开它。在客户端完成下载后,删除服务器中的文件,在这种方法中,我必须

def generateFile = {
 ...
 ...
 outputStream.flush() // save the file to a disk
}

和

Ok.sendFile(new File("foo.pdf"))

我需要向存储磁盘写入和读取文件。而且我认为这不是一种有效的方法。

有没有更好的方法来实现我想要的?

提前谢谢你。

【问题讨论】:

  • 那么,我理解正确吗? 1)您想通过 AJAX 将 JSON 发送到您的 Play 服务器。 2) Play 然后从 JSON 数据中生成一个文件,并将其存储在公共资产文件夹中的某个位置。 3) Play 将这个生成的文件的 URL 返回给客户端。 4) 然后客户端可以通过 GET 下载带有 URL 的文件。 5) 下载完成后播放会删除文件。对吗?
  • @Kris 几乎就像你提到的那样,但有一点,我没想过要存储 JSON 文件,而是自己生成文件。
  • 但是如果我们在这里讨论不同的请求,那么您必须将文件存储在某个地方(例如文件系统)。第一个,AJAX 请求,生成文件,第二个让您下载该文件。由于您的服务器是无状态的,因此您必须将文件存储在某处。
  • @Kris 抱歉,我误读了您所说的内容,您在第一条评论中提到的正是我想要实现的。(我以为您说将 JSON 本身保存到服务器并在客户端生成文件第二个请求。)
  • 我也看不到与将文件临时存储在文件系统中不同的解决方案(它是一个文件 - 这就是文件系统的用途,对 :))。为什么你认为这不是一个好的解决方案?

标签: javascript ajax json scala playframework


【解决方案1】:

为什么你认为这不够有效?

我在一个项目中看到过类似的方法:

  • 使用特殊命名方案将图像转换并存储在任意 tmp 目录中
  • 专用服务器资源将图像流式传输到客户端
  • 每 5 分钟触发一次系统 cronjob 会从 tmp 目录中删除超过 5 分钟的图像

不同之处在于图像数据(在您的情况下是 SVG 字符串)不是由客户端发送的,而是存储在数据库中的。

如果您的转换库能够在内存中生成图像,也许您可​​以跳过将图像写入磁盘的步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2017-09-05
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多