scala.xml 节点到虚拟文件以准备下载它
scala.xml node to virtual file to prepare downloading it
我正在使用 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
来轻松做到这一点,但我希望有一种方法可以避免在硬盘驱动器上写入只是为了将其读回文件流然后删除它例程。
据我了解,您想为您的客户提供 XML,即发送带有 Content-Type: application/xml
.
的 HTTP 响应
如果这是您想做的,那么只需将您的 scala.xml.NodeSeq
作为参数传递给相应 Action
中的 Ok
调用。如 documentation 中所述,Play Framework 将在响应中自动设置正确的 Content-Type
。无需事先将 XML 保存到文件,因为您可以直接发送 XML 作为响应。
例如:
class MyController extends Controller {
def processXml = Action { implicit request =>
// Process XML
val myXml: NodeSeq = getXml()
Ok(myXml)
}
}
所以,对于每个有类似问题的人。在前端更改数据并强制下载似乎更容易。
我按照 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);
在此处找到此解决方案:
致谢 Matěj Pokorný
我正在使用 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
来轻松做到这一点,但我希望有一种方法可以避免在硬盘驱动器上写入只是为了将其读回文件流然后删除它例程。
据我了解,您想为您的客户提供 XML,即发送带有 Content-Type: application/xml
.
如果这是您想做的,那么只需将您的 scala.xml.NodeSeq
作为参数传递给相应 Action
中的 Ok
调用。如 documentation 中所述,Play Framework 将在响应中自动设置正确的 Content-Type
。无需事先将 XML 保存到文件,因为您可以直接发送 XML 作为响应。
例如:
class MyController extends Controller {
def processXml = Action { implicit request =>
// Process XML
val myXml: NodeSeq = getXml()
Ok(myXml)
}
}
所以,对于每个有类似问题的人。在前端更改数据并强制下载似乎更容易。
我按照 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);
在此处找到此解决方案:
致谢 Matěj Pokorný