Сгенерировать контрольную сумму md5 scala js

Я пытаюсь постепенно вычислить контрольную сумму hex md5 в scala js. Контрольная сумма будет проверена на стороне сервера после передачи файла.

Я попытался использовать зависимость spark-md5 scala js web jar:

libraryDependencies ++= Seq("org.webjars.npm" % "spark-md5" % "2.0.2")

jsDependencies += "org.webjars.npm" % "spark-md5" % "2.0.2" / "spark-md5.js"

Скала JS-код: -

val reader =  new FileReader
reader.readAsArrayBuffer(data)  // data is javascript blob object
val spark = scala.scalajs.js.Dynamic.global.SparkMD5.ArrayBuffer
reader.onload = (e: Event) => {
   spark.prototype.append(e.target)
   print("Checksum - > " + spark.end)
}

Ошибка:-

Uncaught TypeError: Не удается прочитать свойство 'buffer' из undefined в Object.SparkMD5.ArrayBuffer.append (sampleapp-jsdeps.js:596) в FileReader. (SampleApp.scala:458)

Я попробовал Google, но большая часть помощи доступна для javascript, я не смог найти ничего о том, как использовать эту библиотеку в scala js.

Извините, если я пропустил что-то очень очевидное, я новичок в javascript и scala js.


person Aiden    schedule 10.12.2016    source источник


Ответы (1)


Из readme spark-md5 я прочитал:

var spark = new SparkMD5.ArrayBuffer();
spark.append(e.target.result);
var hexHash = spark.end();

То, как вы переводите это в Scala.js, выглядит следующим образом (при условии, что вы хотите сделать это динамически типизированным способом):

import scala.scalajs.js
import scala.scalajs.js.typedarray._
import org.scalajs.dom.{FileReader, Event}

val SparkMD5 = js.Dynamic.global.SparkMD5
val spark = js.Dynamic.newInstance(SparkMD5.ArrayBuffer)()
val fileContent = e.target.asInstanceOf[FileReader].result.asInstanceOf[ArrayBuffer]
spark.append(fileContent)
val hexHashDyn = spark.end()
val hexHash = hexHashDyn.asInstanceOf[String]

Интеграция этого с вашим фрагментом кода дает:

val reader =  new FileReader
reader.readAsArrayBuffer(data)  // data is javascript blob object
val SparkMD5 = js.Dynamic.global.SparkMD5
val spark = js.Dynamic.newInstance(SparkMD5)()
reader.onload = (e: Event) => {
   val fileContent = e.target.asInstanceOf[FileReader].result.asInstanceOf[ArrayBuffer]
   spark.append(fileContent)
   print("Checksum - > " + spark.end().asInstanceOf[String])
}

Если это единственное использование SparkMD5 в вашей кодовой базе, вы можете остановиться на этом. Если вы планируете использовать его несколько раз, вам, вероятно, следует определить тип фасада для API, которые вы хотите использовать:

import scala.scalajs.js.annotation._

@js.native
object SparkMD5 extends js.Object {
  @js.native
  class ArrayBuffer() extends js.Object {
    def append(chunk: js.typedarray.ArrayBuffer): Unit = js.native
    def end(raw: Boolean = false): String = js.native
  }
}

который вы можете использовать гораздо более естественно, как:

val reader =  new FileReader
reader.readAsArrayBuffer(data)  // data is javascript blob object
val spark = new SparkMD5.ArrayBuffer()
reader.onload = (e: Event) => {
   val fileContent = e.target.asInstanceOf[FileReader].result.asInstanceOf[ArrayBuffer]
   spark.append(fileContent)
   print("Checksum - > " + spark.end())
}

Отказ от ответственности: не тестировалось. Здесь и там могут потребоваться небольшие адаптации.

person sjrd    schedule 10.12.2016
comment
Спасибо @sjrd. Это круто! - person Aiden; 11.12.2016