首页 > 解决方案 > Laravel、FineUploader 和 FileReader API:在上传前比较文件的哈希值

问题描述

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

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

测试 n1 比较两个字符串:

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

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

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

// 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的情况下读取并散列getFile(id)返回的 Fineuploader 的结果?File or Blob

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

谢谢。

标签: phplaravelhashfine-uploader

解决方案


  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 上传文件

  2. 据此,您仍然必须使用文件阅读器:如何在 FineUploader Azure 请求中包含 Content-MD5 标头?.


推荐阅读