Laravel,FineUploader和FileReader API:上传之前比较文件的哈希值

时间:2018-07-09 12:58:59

标签: php laravel hash fine-uploader

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

在哈希和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)的{​​{1}}的结果?

以上问题的答案可能被认为是广泛的,不在我眼前的问题范围之内,但是我想尽可能地理解该主题。

谢谢。

2 个答案:

答案 0 :(得分: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. 因此,您仍然必须使用filereader:How to include Content-MD5 header in FineUploader Azure request?

答案 1 :(得分:0)

由于@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现在返回true