Akka HTTPを使用してアプリケーションにファイルアップロード機能を実装しようとしています。私はakka-stream
バージョン2.4.4
を使用しています。ここAkka HTTPを使用したファイルアップロード
コード(akka-docから改変)
path("fileupload") {
post {
extractRequestContext {
ctx => {
implicit val materializer = ctx.materializer
implicit val ec = ctx.executionContext
fileUpload("fileUpload") {
case (metadata, byteSource) =>
val location = FileUtil.getUploadPath(metadata)
val updatedFileName = metadata.fileName.replaceAll(" ", "").replaceAll("\"", "")
val uniqFileName = uniqueFileId.concat(updatedFileName)
val fullPath = location + File.separator + uniqFileName
val writer = new FileOutputStream(fullPath)
val bufferedWriter = new BufferedOutputStream(writer)
val result = byteSource.map(s => {
bufferedWriter.write(s.toArray)
}).runWith(Sink.ignore)
val result1 = byteSource.runWith(Sink.foreach(s=>bufferedWriter.write(s.toArray)))
Await.result(result1, 5.seconds)
bufferedWriter.flush()
bufferedWriter.close()
complete(uniqFileName)
/*onSuccess(result) { x =>
bufferedWriter.flush()
bufferedWriter.close()
complete("hello world")
}*/
}
}
}
}
}
このコードが正常に動作して、所定のパスにファイルをアップロードされています。私はファイル名が一意であることを確認するためにUUIDを追加して新しいファイル名を生成しています。だから私は呼び出し元に新しいファイル名を返す必要があります。ただし、このメソッドは常にファイル名を返しません。場合によっては、Response has no content
で終了しています。
誰でも私がここで間違っていることを教えてもらえますか?
これはあなたの質問に対する回答ではありませんが、http://doc.akka.io/docs/akka/2.4.6/scala/stream/stages-overview.html#file-io-sinks-andを参照してください。手動でファイルに書き込む代わりにソースを使用します。また、ルート内でAwait.resultを使用すると、本当に悪いスタイルです。 –
それを見るでしょう。私はAwaitの代わりにonSuccessを試してみました。だから私はAwaitを試した。返信をありがとう、私はリンクを試してみましょう。 –
@RüdigerKlaehn私はFileIOを試しましたが、同じ問題が残っています:( –