在我更新的舊版程序中,我在某個時間接收到用戶上傳的文件,此文件需要在外部服務中進行分析。發送可用作輸入流而非文件的文件
我知道如何使用噴霧將文件發送到服務。特別是我知道如何從磁盤採取文件,因爲噴霧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))))
}
正如你可以看到有沒有什麼應對的InputStream或東西一樣的代碼。
感謝您的回答。我沒有問題。我已經寫了一個可以完成這項工作的程序。我會在我的問題中編輯它,以便您可以看到。事情是我有一個輸入流,而不是在磁盤上的特定位置上的文件 – MaatDeamon