LoginSignup
3
0

More than 3 years have passed since last update.

akka-httpでファイルアップロード時にBOMを取り除く

Last updated at Posted at 2019-06-14

akka-httpでtxtファイルをアップロードをする際、UTF8 with BOMなファイルがアップロードされた時にBOMを取り除いて文字列を復元したい。
ざっと探した感じうまく見つからず。

ただ、alpakkaにCSVを処理するライブラリがあって、そこに

The parser accepts Byte Order Mark (BOM) for UTF-8

とあるのでこのライブラリのコードを読めば出来そう。
で、参考にやってみて無事出来ました。
akka-httpというより実質、akka-stream。

val ByteOrderMark = ByteString.apply(0xEF.toByte, 0xBB.toByte, 0xBF.toByte)

def route =
  extractRequestContext { ctx =>
    implicit val materializer = ctx.materializer

    fileUpload("file") {
      case (metadata, byteSource) =>
        var firstLine = true
        val linesF: Future[Seq[String]] =
          byteSource
            .via(Framing.delimiter(ByteString("\n"), 1024), allowTruncation = true)
            .map { bs =>
              val bs2 = if (firstLine && bs.startsWith(ByteOrderMark)) bs.drop(3) else bs
              if (firstLine) firstLine = false
              bs2.decodeString("UTF-8")
            }
            .runFold(Seq.empty[String]) { case (acc, elem) => acc :+ elem }

        .......
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0