2017-02-26 35 views
0

假如我有一個需要從客戶端上傳到服務器的excel文件(大小範圍從0〜100MB),那麼它會被解析。如何用Akka-Http做到這一點?我看了doc,看來他們只支持json和csv格式。Akka http讀取並解析上傳的excel文件

另外,從服務器端的角度來看,我是否必須在文件上傳之後才解析文件,或者只要在上傳過程中可用,我就可以一次解析一個數據條目?

+0

這是什麼使用Excel除了它是源文件嗎? –

+0

@MarkFitzgerald,我需要在服務器端收到內容後解析內容(使用Apache POI)。我不確定使用Akka-Http時處理字節流傳輸的過程。 – Bin

+0

不知道Akka-Http或Scala的Excel用戶如何回答此問題? –

回答

2

與任何其他文件類型相比,excel文件沒有什麼特別之處。

文件指令

已經存在的指令響應得到一個文件請求:

import akka.http.scaladsl.server.Directives._ 
import java.io.File 
import akka.http.scaladsl.model.ContentTypes 

val easyRoute : Route = 
    getFromFile(File("/path/to/excelFile.xls"), 
       ContentTypes.`application/octet-stream`) 

手動創建

您可以使用file io創建的一個Source excel文件作爲ChunkStreamPart

import akka.stream.scaladsl._ 
import akka.http.scaladsl.model.HttpEntity.ChunkStreamPart 

val excelFile = Paths get "example.xls" 

val fileChunkSource :() => Source[ChunkStreamPart, _] = 
() => FileIO fromPath excelFile 

此文件的源可以被用來創建一個HttpEntity:

import akka.http.scaladsl.model.HttpEntity 

val entity :() => HttpEntity = 
() => HttpEntity(ContentTypes.`application/octet-stream`, fileSource()) 

然後可以的HttpResponse實體:

import akka.http.scaladsl.model.HttpResponse 

val excelResponse :() => HttpResponse = 
() => HttpResponse(entity = entity()) 

這個響應可以是一個標準的一部分route

val route = 
    get { 
    path(/ "excelFile") { 
     complete(excelResponse()) 
    } 
    } 
+0

您也可以直接使用'HttpEntity.apply',這比通過'ChunkStreamPart.apply'簡單一點。 – jrudolph

+0

@jrudolph謝謝你的建議。如此編輯。 –