scala.xml节点到虚拟文件准备下载它

时间:2018-05-16 13:55:52

标签: xml scala playframework java.nio.file

我正在使用scala和play框架来创建API服务器。在我的一个API调用中,我上传了一个JSON,在服务器上进行了一些干预后,我发回了一个XML。然后应该将此XML作为文本文件下载,我认为如果我在后端直接开始下载并且不在前端创建文件,这是最简单的。

我已经使用scala.xml包成功创建了我想要的XML,现在我确实有一个node对象,打印时看起来非常像我正在寻找的XML。

Scala的scala.xml.XML对象有一个方法,恰当地称为save,它允许我从XML中创建一个文件。我可以使用它来创建我的XML,但这意味着我必须将它保存在硬盘上,这是它自己的蠕虫。但是,如果将文件保存在RAM中,我有点死了。任何人都可以帮助我吗?

编辑1:

为了澄清,在前端我用axios调用这个API。在我的用户的计算机上,应该有一个下载对话框打开,询问我的用户保存文件的位置foo.xml。据我了解,我需要将XML转换为文件流。我只需将其保存在硬盘驱动器上并使用java.nio即可轻松完成此操作,但我希望有一种方法可以避免写入硬盘驱动器只是将其读回文件流然后删除它的例程。

2 个答案:

答案 0 :(得分:1)

据我所知,您希望为您的客户提供XML,即使用Content-Type: application/xml发送HTTP响应。

如果这是您要执行的操作,那么只需将scala.xml.NodeSeq作为参数传递到相应Ok中的Action来电。如documentation中所述,Play框架会自动在响应中设置正确的Content-Type。事先没有必要将XML保存到文件中,因为您可以直接将XML作为响应发送。

例如:

class MyController extends Controller {

  def processXml = Action { implicit request =>
    // Process XML
    val myXml: NodeSeq = getXml()
    Ok(myXml)
  }
}

答案 1 :(得分:0)

所以,对于有类似问题的每个人。更改前端中的数据并强制下载似乎更容易。

我像Matthias A. Eckhart建议的那样返回了数据。在前端,我用这个小函数提供了数据:

function download(filename, text) {
    const element = document.createElement('a');
    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    element.setAttribute('download', filename);

    element.style.display = 'none';
    document.body.appendChild(element);

    element.click();

    document.body.removeChild(element);

此解决方案可在此处找到:https://stackoverflow.com/a/18197341/9094259

MatějPokorný的致谢