2015-06-03 72 views
0

在我更新的舊版程序中,我在某個時間接收到用戶上傳的文件,此文件需要在外部服務中進行分析。發送可用作輸入流而非文件的文件

我知道如何使用噴霧將文件發送到服務。特別是我知道如何從磁盤採取文件,因爲噴霧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或東西一樣的代碼。

回答

0

如果您確信這不會導致您的用例出現問題(例如> 2GB文件),您可以將輸入流寫入內存中的字節數組。但老實說,你應該能夠上傳一個輸入流(提供你知道的長度) - 當你嘗試使用Spray上傳時你有什麼問題?

+0

感謝您的回答。我沒有問題。我已經寫了一個可以完成這項工作的程序。我會在我的問題中編輯它,以便您可以看到。事情是我有一個輸入流,而不是在磁盤上的特定位置上的文件 – MaatDeamon