2017-10-17 8 views
3

Lagomエントリポイントのほとんどは、マルチパートフォームリクエストを使用しませんが、1つは行います。 Lagomは現在マルチパートリクエストをネイティブにサポートしていないので、私が見てきた一般的な提案は、PlayServiceCallメカニズムを使って、基礎となるPlay APIを呼び出すことです。Lagomを使用したマルチパートフォームエラー

私たちはこれを行い、それはほとんどの場合動作します。しかし、特に大容量のファイルを提出する際に断続的なエラーが発生します。これらのファイルは、常に、ファイル全体が処理のために受信されていないかのように見える、さまざまな種類のjava.util.zip.ZipExceptionのケースです。

コード内でのエントリポイントの表示は次のとおりです。具体的には、プレイラッピングメカニズム:

Caused by: java.util.zip.ZipException: invalid code lengths set 
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) 
    at java.util.zip.ZipInputStream.read(ZipInputStream.java:194) 
    at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:214) 
    at java.io.FilterInputStream.read(FilterInputStream.java:107) 
    etc. 

Caused by: java.util.zip.ZipException: invalid distance too far back 
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) 
    at java.util.zip.ZipInputStream.read(ZipInputStream.java:194) 
    at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:214) 
    at java.io.FilterInputStream.read(FilterInputStream.java:107) 
    etc. 

我々はScalaで、Lagom 1.3.8を使用します。ここでは

def upload = PlayServiceCall[NotUsed, UUID] { 
    wrapCall => Action.async(multipartFormData) { 
    request => wrapCall(ServiceCall { _ => 
     val upload = request.body.file("upload") 
     val input = new FileInputStream(upload.get.ref.file) 
     val filename = upload.get.filename 
     // ... 
     // other code to actually process the file 
     // ... 
    })(request).run 
    } 
} 

は、私たちが見ている例外のちょうど2つの例があります。何か提案してください。

答えて

6

Akka HTTPに基づいて新しいサービスゲートウェイを使用してみてください。

あなたのbuild.sbtに以下を追加することで、これを有効にすることができます。

lagomServiceGatewayImpl in ThisBuild := "akka-http" 

新しいサービスゲートウェイがまだLagom 1.3.8ではデフォルトで無効になっていますが、この問題を経験しているLagomのユーザーがいることを報告していますakka-httpゲートウェイを有効にすることで解決されます。これはLagom 1.4.0のデフォルト実装になります。

関連する問題