如何在DropzoneJS中生成文件的SHA1校验值?
在DropzoneJS中生成文件SHA1用于Backblaze B2上传
你可以基于原生JS的SHA1生成逻辑,结合Dropzone的文件对象实现需求。核心思路是利用FileReader读取Dropzone文件对象的内容,再用CryptoJS计算SHA1值,最后设置到请求头中。
步骤1:封装SHA1生成函数
先写一个返回Promise的异步函数,方便在Dropzone的异步流程中调用:
function generateSHA1(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = function() { try { // 读取文件二进制内容并计算SHA1,转成十六进制字符串 const hash = CryptoJS.SHA1(CryptoJS.enc.Latin1.parse(reader.result)).toString(CryptoJS.enc.Hex); resolve(hash); } catch (err) { reject(err); } }; reader.onerror = reject; reader.readAsBinaryString(file); }); }
步骤2:修改Dropzone代码
在获取预签名URL后,调用上述函数生成SHA1,再设置请求头并触发文件上传:
let myDropzone = new Dropzone("#dropzone", { acceptedFiles: "image/jpeg,image/jpg", maxFilesize: 100, init: function () { this.on("addedfile", function (file) { fetch("/api/presign-upload-url", { headers: { "Content-Type": "application/json", "Accept": "application/json", "X-Requested-With": "XMLHttpRequest", "X-CSRF-Token": csrfToken }, method: "post", credentials: "same-origin", body: JSON.stringify({ key: file.name }) }) .then(function (response) { return response.json(); }) .then(function (json) { // 生成文件SHA1值 return generateSHA1(file).then(hash => { // 设置Backblaze B2所需的请求头 myDropzone.options.headers = { "Content-Type": file.type, "Authorization": json.upload_url.authorizationToken, "X-Bz-File-Name": file.name, "X-Bz-Content-Sha1": hash, }; myDropzone.options.url = json.upload_url.uploadUrl; // 触发文件上传 myDropzone.processFile(file); }); }) .catch(function(err) { console.error("上传准备失败:", err); // 给用户显示错误提示 myDropzone.emit('error', file, '文件校验值生成失败,请重试'); }); }); } });
注意事项
- 确保已引入CryptoJS库(需包含SHA1模块),否则无法计算哈希值。
- Dropzone的
addedfile事件中拿到的file对象是原生File的包装实例,可以直接传给FileReader使用。 - Backblaze B2要求
X-Bz-Content-Sha1的值是SHA1的十六进制字符串,因此必须调用.toString(CryptoJS.enc.Hex)将CryptoJS返回的哈希对象转成字符串。
内容的提问来源于stack exchange,提问作者Only Bolivian Here
相关产品推荐
相关产品推荐

