发送可用作输入流而不是文件的文件

时间:2015-06-03 13:27:34

标签: scala spray

在我正在更新的遗留程序中,我在某个时刻收到用户上传的文件,此文件需要在外部服务中进行分析。

我知道如何使用spray将文件发送到服务。特别是我知道如何从磁盘中获取文件,因为喷涂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:

以下是BodyPart的代码

    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))))
}

正如你所看到的,没有什么可以处理输入流或类似的事情。

1 个答案:

答案 0 :(得分:0)

您可以将输入流写入内存中的字节数组,如果您确信这不会导致您的用例出现问题(例如> 2GB文件)。但老实说,你应该能够上传一个输入流(如果你知道长度) - 当你尝试使用Spray上传时你遇到了什么问题?