在我正在更新的遗留程序中,我在某个时刻收到用户上传的文件,此文件需要在外部服务中进行分析。
我知道如何使用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))))
}
正如你所看到的,没有什么可以处理输入流或类似的事情。
答案 0 :(得分:0)
您可以将输入流写入内存中的字节数组,如果您确信这不会导致您的用例出现问题(例如> 2GB文件)。但老实说,你应该能够上传一个输入流(如果你知道长度) - 当你尝试使用Spray上传时你遇到了什么问题?