ПОЛУЧИТЬ содержимое файла DataPart без сохранения файла - PullRequest
0 голосов
/ 02 октября 2018


Я пытаюсь получить содержимое загруженного файла (используя POST) БЕЗ необходимости создавать / копировать этот файл в локальный каталог.Есть ли какой-нибудь способ, которым это возможно в scala?
Вот мой код:

def uploadSchema = Action(parse.multipartFormData) { request =>
request.body.file("source").map { sourceFile =>
  val filename = Paths.get(sourceFile.filename).getFileName
  sourceFile.ref.moveTo(Paths.get(s"/usr/local/polymer/schema/uploads/$filename"), replace = true)
  Ok(s"Uploaded successfully!"+sourceFile.)
}.getOrElse {
  Redirect(routes.NLPController.uploadSchema).flashing("error" -> "Missing file.")
}

Что я хочу сделать, это вместо того, чтобы

sourceFile.ref.moveTo(Paths.get(s"/usr/local/polymer/schema/uploads/$filename"), replace = true)

Делать что-то вроде

val content : String = Source.fromFile(file).getLines.mkString

Вот мой API из routes файла

POST   /api/upload   controllers.NLPController.uploadSchema 

Возможно ли это?Если нет, то почему?

1 Ответ

0 голосов
/ 02 октября 2018

Вы говорите, что хотите сделать следующее:

  1. Вы хотите загрузить что-либо через приложение Play на компьютер.
  2. Вы не хотите копировать его в локальный каталог машины.

Проблема здесь в том, куда должен идти файл?Если у меня есть приложение на сервере, и я загружаю свой файл с помощью этого метода, файл будет всегда первым на сервере.Потому что его нужно скопировать куда-то до того, как вы захотите переместить его в другое место (облако, другой сервер резервного копирования).

А как насчет чтения содержимого файлов?

Это еще один вопрос, не связанный с загрузкой, а не с чтением содержимого файлов, вы можете сделать это:

import scala.io.Source
val myFileContent = Source.fromFile("myFile.txt").getLines.mkString

Примечание об обновлении

Хорошо, в комментариях вы говорите, что у вас есть приложение A, для которого вы хотите получить содержимое файла и затем отправить его вприложение B. Ну, почему бы вам не сделать это:

  1. Маршрут со строкой запроса : есть маршрут, который получает путь к файлу в виде строки запроса:

    GET /file-content    controllers.file.readContent (path: String)
    

    Затем вы вызываете приложение следующим образом:

    /file-content?path=whereever/i-want/myfile-be.txt
    
  2. Метод для чтения содержимого и помещения его в ответ : Тогдав рамках вашего readContent метода вы возвращаете тело файла тому, кто вызывает приложение A:

    def readContent (filePath: String) = Action{
      implicit request => 
        Ok(Source.fromFile(filePath).getLines.mkString))
    }
    

Обновление Примечание 2: не забывайте о безопасности!

Приведенное выше решение отлично работает для считывания данных и их возврата.Но вы также должны принять меры безопасности.Вы не хотите передавать содержимое файла любому, кто вызывает этот URL.Вы можете добавить токен в приложение вызывающего абонента, чтобы приложение, которое работает с содержимым данных, сначала проверило, авторизован ли пользователь, а затем проверило содержимое файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...