Laravel、FineUploader 和 FileReader API:上传前比较文件哈希

Laravel, FineUploader and FileReader API: compare hash of file before uploading

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

对散列和 FileReader API 的主题相当 "new",我发现这个过程有点混乱。 我正在使用前端库 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) 有没有办法在不使用文件读取器 api 的情况下读取和散列 fineuploader getFile(id) returns File or Blob 的结果?

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

谢谢。

  1. Input::file() returns 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. 根据这个你仍然必须使用文件阅读器:.

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

前端

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 returns true