В устаревшей программе, которую я обновляю, я получаю в какой-то момент файл, загруженный пользователем, этот файл необходимо проанализировать в рамках внешней службы.Отправка файла, доступного как входной поток, а не файла
Я знаю, как отправить файл в службу, используя спрей. В частности, я знаю, как взять файл с диска, поскольку спрей api является конструкцией как таковой
В моей текущей конкретной ситуации у меня только входной поток, а не файл. Это файл, который загружается пользователем для выполнения некоторого анализа. То есть, как только у меня будет файл, я отправлю его во внешнюю службу для анализа. Однако API-интерфейс спрей, особенно http-данные, работает только с файлом, а не с потоком ввода, который является типом данных, в котором у меня есть данные после загрузки файла. Я имею дело с некоторым устаревшим кодом.
Мне было интересно, как иметь дело с тем, что мой файл в настоящий момент является входным потоком. Я где-то краснею, что решение могло бы мне написать временный файл на диске и загрузить с ним. Но доступ к диску все время для этого звучит долго для меня.
Есть ли другой способ?
Ниже вы можете найти типовой код, который я написал бы по этому вопросу. Однако в этом случае файл доступен только мне в виде входного потока.
Edit1
import context.dispatcher // execution context for futures below
val file = new File((getClass.getResource("/Health-Benefit-Plans.pdf")).toURI)
val pipeline = addCredentials(BasicHttpCredentials("xxxxx", "xxxxxx")) ~> sendReceive
val payload = MultipartFormData(Seq(BodyPart(file, "file", MediaTypes.`application/pdf`)))
val request = Post("xxxx/categorization?projectId=xxxxx&language=en", payload)
pipeline(request)
Edit2:
Вот код
части телаobject BodyPart {
@deprecated("Use a BodyPart.apply overload instead", "1.0/1.1/1.2")
def forFile(fieldName: String, file: FormFile): BodyPart =
apply(file, fieldName)
def apply(file: File, fieldName: String): BodyPart = apply(file, fieldName, ContentTypes.`application/octet-stream`)
def apply(file: File, fieldName: String, contentType: ContentType): BodyPart =
apply(HttpEntity(contentType, HttpData(file)), fieldName, Map.empty.updated("filename", file.getName))
def apply(formFile: FormFile, fieldName: String): BodyPart =
formFile.name match {
case Some(name) ⇒ apply(formFile.entity, fieldName, Map.empty.updated("filename", name))
case None ⇒ apply(formFile.entity, fieldName)
}
def apply(entity: HttpEntity, fieldName: String): BodyPart = apply(entity, fieldName, Map.empty[String, String])
def apply(entity: HttpEntity, fieldName: String, parameters: Map[String, String]): BodyPart =
BodyPart(entity, Seq(`Content-Disposition`("form-data", parameters.updated("name", fieldName))))
}
Как вы можете видеть, что нет ничего, чтобы иметь дело с InputStream, так или что-то.
Спасибо за ваш ответ. У меня нет проблемы. Я написал уже программу, которая выполняет эту работу. Я отредактирую его в своем вопросе, чтобы вы могли видеть. Дело в том, что у меня есть входной поток, а не файл в определенном месте на диске – MaatDeamon