【发布时间】: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))))
}
如您所见,没有什么可以处理输入流或类似的东西。
【问题讨论】: