узел scala.xml для виртуального файла, чтобы подготовить его загрузку - PullRequest
0 голосов
/ 16 мая 2018

Я использую Scala и Play Framework для создания сервера API.На одном из моих вызовов API я загружаю JSON и после некоторого вмешательства на сервер отправляю обратно XML.Затем этот XML должен быть загружен в виде текстового файла, и я решил, что будет проще, если я непосредственно начну загрузку в бэкэнде, а не просто создаю файл в интерфейсе.

Я успешно создалXML Я хотел использовать пакет scala.xml, и у меня теперь есть объект node, который при печати выглядит поразительно как искомый XML.

У объекта scala.xml.XML в Scala есть метод, метко названныйsave, что позволяет мне сделать файл из XML.Я мог бы использовать это для создания своего XML, но это означает, что я должен сохранить его на жестком диске, который является его собственной червей.Но я как бы мертв в воде, как сохранить файл в оперативной памяти.Может ли кто-нибудь помочь мне здесь?

РЕДАКТИРОВАТЬ 1:

Чтобы уточнить, на передней стороне я называю этот API с axios.На компьютере моего пользователя должно открыться диалоговое окно загрузки, спрашивающее моего пользователя, где сохранить файл, который может называться foo.xml.Насколько я понимаю, мне нужно преобразовать мой XML в поток файлов.Я могу легко это сделать, просто сохранив его на жестком диске и использовав на нем java.nio, но я надеялся, что есть способ избежать записи на жесткий диск, просто прочитав его обратно в файловый поток и затем удалив егорутина.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Итак, для всех с похожей проблемой. Кажется, намного проще изменить данные в интерфейсе и принудительно загрузить.

Я вернул данные так, как предложил Матиас А. Экхарт. И во внешнем интерфейсе я подал данные в этой маленькой функции:

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

Кредиты Матей Покорны

0 голосов
/ 16 мая 2018

Насколько я понял, вы хотите обслуживать своих клиентов XML, то есть отправлять HTTP-ответ с Content-Type: application/xml.

Если это то, что вы хотите сделать, тогда просто передайте свой scala.xml.NodeSeq в качестве аргумента для вашего Ok вызова в соответствующем Action.Как указано в документации , Play Framework автоматически установит правильный Content-Type в ответе.Нет необходимости предварительно сохранять XML в файл, так как вы можете напрямую отправить XML в качестве ответа.

Например:

class MyController extends Controller {

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