2015-06-03 2 views
0

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

Я знаю, как отправить файл в службу, используя спрей. В частности, я знаю, как взять файл с диска, поскольку спрей 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, так или что-то.

ответ

0

Вы можете написать входной поток в массив байтов в памяти, если вы уверены, что это не вызовет проблем для вашего использования (например,> 2 ГБ файлов). Но, честно говоря, вы должны иметь возможность загружать входной поток (если знаете длину) - какая у вас проблема, когда вы пытаетесь использовать Spray для загрузки?

+0

Спасибо за ваш ответ. У меня нет проблемы. Я написал уже программу, которая выполняет эту работу. Я отредактирую его в своем вопросе, чтобы вы могли видеть. Дело в том, что у меня есть входной поток, а не файл в определенном месте на диске – MaatDeamon