php - 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
上述问题的答案可能被认为是宽泛的,超出了我当前问题的范围,但我想尽可能地理解这个主题。
谢谢。
解决方案
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 上传文件据此,您仍然必须使用文件阅读器:如何在 FineUploader Azure 请求中包含 Content-MD5 标头?.
推荐阅读
- snowflake-cloud-data-platform - okta 推动的雪花角色的成员资格限制?
- javascript - 反应可拖动元素,没有滞后
- javascript - 如何将 e 值的小数缩短为仅 2 位
- spring - 使用 SpyBean 推迟 PostConstruct
- javascript - 我如何从第一个 url 获取值并将该值传递给第二个 url 参数?
- assembly - 如何正确操作装配中的堆栈?
- python - 编写 DataFrames 的函数可防止 workbook.close()
- python - AttributeError:“str”对象没有属性“text”错误
- ios - 是什么导致此 BadDeviceToken 响应?
- c++ - 使用抽象基类为模板参数类型强制使用公共接口是不好的做法吗?