el-upload 上传文件 利用cryptojs 分块计算文件sha256
时间: 2023-11-02 20:59:43 浏览: 129
可以使用以下代码实现利用cryptojs分块计算文件sha256并上传文件:
```javascript
<el-upload
action="url/to/upload"
:before-upload="beforeUpload"
>
<el-button type="primary">上传文件</el-button>
</el-upload>
<script>
import CryptoJS from 'crypto-js'
export default {
methods: {
async beforeUpload(file) {
const chunkSize = 1024 * 1024 // 分块大小为1MB
const chunks = Math.ceil(file.size / chunkSize) // 计算总共分多少块
const sha256Array = [] // 用于存储每个分块的sha256值
for (let i = 0; i < chunks; i++) {
const start = i * chunkSize
const end = i === chunks - 1 ? file.size : start + chunkSize
const chunk = file.slice(start, end) // 分块
const sha256Value = await this.calculateSha256(chunk) // 计算分块的sha256值
sha256Array.push(sha256Value.toString()) // 存储sha256值
}
// 将所有分块的sha256值组成一个字符串并计算其sha256值
const fileSha256 = CryptoJS.SHA256(sha256Array.join('')).toString()
// 将文件和sha256值作为FormData提交给后端
const formData = new FormData()
formData.append('file', file)
formData.append('sha256', fileSha256)
return { data: formData }
},
calculateSha256(chunk) {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsArrayBuffer(chunk)
reader.onload = () => {
const wordArray = CryptoJS.lib.WordArray.create(reader.result)
const sha256Value = CryptoJS.SHA256(wordArray)
resolve(sha256Value)
}
reader.onerror = reject
})
}
}
}
</script>
```
在这个例子中,我们使用了`async/await`语法来等待每个分块的sha256值计算完毕后再继续下一个分块的计算。注意到`beforeUpload`方法需要返回一个对象,其中`data`属性为一个`FormData`对象,这个对象中包含了文件和计算出来的sha256值。这样,在上传文件时,后端就可以利用这个sha256值来验证文件是否完整且未被篡改。
阅读全文