生成md5校验和scala js

时间:2016-12-10 05:50:03

标签: md5 scala.js webjars

我试图以递增的方式计算scala js中的hex md5校验和。传输文件后,将在服务器端验证校验和。

我尝试使用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"

scala 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)
}

错误: -

  

未捕获的TypeError:无法读取属性'缓冲区'未定义的       at Object.SparkMD5.ArrayBuffer.append(sampleapp-jsdeps.js:596)       在FileReader。 (SampleApp.scala:458)

我试过google但大部分帮助都是针对javascript的,无法找到有关如何在scala js中使用此库的任何内容。

抱歉,如果我错过了一些非常明显的内容,我不熟悉javascript和amp; scala js。

1 个答案:

答案 0 :(得分:0)

来自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())
}

免责声明:未经测试。它可能需要在这里和那里进行小的调整。