【问题标题】:Laravel, FineUploader and FileReader API: compare hash of file before uploadingLaravel、FineUploader 和 FileReader API:在上传之前比较文件的哈希值
【发布时间】:2018-12-17 04:12:21
【问题描述】:

我想将文件的散列版本与数据库中存储的数据进行比较,以便中止重复上传。

对于散列和 FileReader API 的主题相当“新”,我发现这个过程有点混乱。 我正在使用前端库 SparkMD5.js

测试 n1 比较两个字符串:

// frontend
$.post(url, {sparkMD5('random text')})

// backend
$input->hash == md5('random text')  // outputs true

测试 n2 - 在 Fineuploader onSubmit 事件处理程序中

// frontend
var file = this.getFile(id);
var reader = new FileReader();
//
reader.onload = function(e) {
  var data = reader.result;
  var hexHash = SparkMD5.hash(data);
  console.log(hexHash);
}

var res = reader.readAsDataURL(file); // or reader.readAsBinaryString(file)

......

//backend
$file = Input::file('qqfile');
$hash = md5(file ) // or md5_file(file )
$hash == $input->hexHash // outputs false

我的问题:

1) 为什么是md5($file) == md5_file($file) \\ false 的结果?

2) 读取文件readAsDataURL or readAsBinaryString 的正确方法是什么?

3) 有没有办法在不使用 filereader api 的情况下读取和散列 Fineuploader 的 getFile(id) 的结果并返回 File or Blob

上述问题的答案可能被认为是宽泛的,超出了我当前问题的范围,但我想尽可能地理解这个主题。

谢谢。

【问题讨论】:

    标签: php laravel hash fine-uploader


    【解决方案1】:
    1. Input::file() 返回一个 Illuminate\Http\UplaodedFile 的实例,因此要获取其内容的哈希值,您可以执行以下操作:
    // md5_file takes in the file path as argument
    $hash = md5_file(Input::file('yourfile')->path());
    
    1. readAsDataURL() 更安全,因为文件被编码为 base64。只需确保服务器知道编码,这意味着删除第一个字符直到逗号,然后将其余字符解码为 base64。更多信息在这里:fileReader.readAsBinaryString to upload files

    2. 据此,您仍然必须使用文件阅读器:How to include Content-MD5 header in FineUploader Azure request?

    【讨论】:

    • 谢谢,@aljo f - 你给我指路了。我正在添加代码作为次要答案。
    【解决方案2】:

    感谢@alio,我能够想出一个解决方案。这是代码。

    前端

    var t = this;
    
    var reader = new FileReader();
    var file = this.getFile(id);
    reader.addEventListener("load", function () {
      var base64result = reader.result.split(',')[1]; // only get base64 string
      var hash = SparkMD5.hash(base64result);
    }, false);
    
    var data = reader.readAsDataURL(file);
    

    有关onSubmit 处理程序的信息,请参阅FineUploader docs

    后端

    $this->file = Input::file('qqfile');
    $base64 = base64_encode(file_get_contents($this->file));
    $hash = md5($base64);
    

    比较前端的 md5 和后端的 md5 现在返回 true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2012-05-06
      • 2021-11-30
      • 1970-01-01
      相关资源
      最近更新 更多