【问题标题】:Sending a file that is available as inputstream rather than file发送可用作输入流而不是文件的文件
【发布时间】:2015-06-03 13:27:33
【问题描述】:

在我正在更新的旧程序中,我有时会收到用户上传的文件,该文件需要在外部服务中进行分析。

我知道如何使用 Spray 将文件发送到服务。特别是我知道如何从磁盘中获取文件,因为喷雾 api 就是这样设计的

在我目前的特殊情况下,我只有一个输入流而不是一个文件。这是一个由用户上传的文件,用于对其进行一些分析。也就是说,一旦我有了文件,我就会将它发送到外部服务进行分析。然而,spray API,尤其是 http 数据仅适用于文件而不是输入流,这是上传文件后我拥有数据的数据类型。我正在处理一些遗留代码。

我想知道如何处理我的文件目前是输入流的事实。我在某处红了,一个解决方案可以让我写入磁盘上的临时文件并使用它进行上传。但是对我来说一直访问磁盘这件事听起来很长。

还有其他方法吗?

您可以在下面找到我会为此编写的典型代码。但是在这种情况下,该文件只能以输入流的形式提供给我。

编辑1

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)

编辑2:

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

如您所见,没有什么可以处理输入流或类似的东西。

【问题讨论】:

    标签: scala spray


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我没有问题。我已经编写了一个可以完成这项工作的程序。我将在我的问题中对其进行编辑,以便您查看。问题是我有一个输入流,而不是磁盘上特定位置的文件
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 2015-03-27
    • 2016-10-23
    • 1970-01-01
    • 2020-03-03
    • 2011-08-27
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多