【问题标题】:Generate md5 checksum scala js生成md5校验和scala js
【发布时间】:2016-12-10 05:50:03
【问题描述】:

我正在尝试在 scala js 中逐步计算十六进制 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)
}

错误:-

未捕获的类型错误:无法读取未定义的属性“缓冲区” 在 Object.SparkMD5.ArrayBuffer.append (sampleapp-jsdeps.js:596) 在文件阅读器。 (SampleApp.scala:458)

我尝试了 google,但大部分帮助都适用于 javascript,找不到任何关于如何在 scala js 中使用这个库的信息。

对不起,如果我错过了一些非常明显的东西,我对 javascript 和 scala js 都是新手。

【问题讨论】:

    标签: md5 scala.js webjars


    【解决方案1】:

    从 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]
    

    将其与您的代码 sn-p 集成:

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

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

    【讨论】:

    • 谢谢@sjrd。这太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多