假如我有一個需要從客戶端上傳到服務器的excel文件(大小範圍從0〜100MB),那麼它會被解析。如何用Akka-Http做到這一點?我看了doc,看來他們只支持json和csv格式。Akka http讀取並解析上傳的excel文件
另外,從服務器端的角度來看,我是否必須在文件上傳之後才解析文件,或者只要在上傳過程中可用,我就可以一次解析一個數據條目?
假如我有一個需要從客戶端上傳到服務器的excel文件(大小範圍從0〜100MB),那麼它會被解析。如何用Akka-Http做到這一點?我看了doc,看來他們只支持json和csv格式。Akka http讀取並解析上傳的excel文件
另外,從服務器端的角度來看,我是否必須在文件上傳之後才解析文件,或者只要在上傳過程中可用,我就可以一次解析一個數據條目?
與任何其他文件類型相比,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())
}
}
您也可以直接使用'HttpEntity.apply',這比通過'ChunkStreamPart.apply'簡單一點。 – jrudolph
@jrudolph謝謝你的建議。如此編輯。 –
這是什麼使用Excel除了它是源文件嗎? –
@MarkFitzgerald,我需要在服務器端收到內容後解析內容(使用Apache POI)。我不確定使用Akka-Http時處理字節流傳輸的過程。 – Bin
不知道Akka-Http或Scala的Excel用戶如何回答此問題? –