我想将文件的散列版本与数据库中存储的数据进行比较,以便中止重复的上传。
在哈希和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}}的结果?
以上问题的答案可能被认为是广泛的,不在我眼前的问题范围之内,但是我想尽可能地理解该主题。
谢谢。
答案 0 :(得分:1)
Input::file()
返回Illuminate\Http\UplaodedFile
的实例,因此,要获取其内容的哈希,可以执行以下操作:// md5_file takes in the file path as argument $hash = md5_file(Input::file('yourfile')->path());
readAsDataURL()
更安全,因为该文件被编码为base64。只需确保服务器知道编码,即删除第一个字符(直到逗号),然后将其余字符解码为base64。这里的更多信息:fileReader.readAsBinaryString to upload files
因此,您仍然必须使用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