vue使用el-upload 上传文件时 利用cryptojs 分块计算文件sha256
时间: 2023-12-02 15:03:32 浏览: 229
可以使用以下方法:
1. 安装crypto-js库:
```
npm install crypto-js
```
2. 引入crypto-js库:
```javascript
import CryptoJS from 'crypto-js'
```
3. 在el-upload组件的before-upload事件中,利用FileReader读取文件内容,然后根据上传的chunk大小进行分块计算文件的sha256:
```html
<el-upload
class="upload-demo"
ref="upload"
:action="uploadUrl"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-upload="beforeUpload"
:on-success="handleSuccess"
:on-error="handleError"
>
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
```
```javascript
beforeUpload(file) {
const reader = new FileReader()
const chunkSize = 1024 * 1024 // 分块大小为1MB
const chunks = Math.ceil(file.size / chunkSize)
const sha256List = []
const _this = this
reader.onload = function() {
const sha256 = CryptoJS.SHA256(CryptoJS.lib.WordArray.create(this.result))
sha256List.push(sha256)
if (sha256List.length === chunks) {
const fileSha256 = CryptoJS.SHA256(CryptoJS.lib.WordArray.create(sha256List.reduce((prev, curr) => {
return prev.concat(curr)
}, [])))
console.log(fileSha256.toString())
// 将文件sha256保存到formData中
const formData = new FormData()
formData.append('file', file)
formData.append('sha256', fileSha256.toString())
// 调用上传接口
_this.$refs.upload.submit(formData)
} else {
readNext()
}
}
function readNext() {
const start = sha256List.length * chunkSize
const end = Math.min(file.size, start + chunkSize)
reader.readAsArrayBuffer(file.slice(start, end))
}
readNext()
// 返回false,阻止文件上传
return false
}
```
以上代码中,利用FileReader读取文件的内容,然后根据上传的chunk大小进行分块计算文件的sha256,将计算出的sha256保存到数组中。当所有分块的sha256计算完成后,再将所有分块的sha256合并计算出文件的sha256,并将文件的sha256保存到formData中。最后调用上传接口上传文件和sha256。
注意:在调用上传接口时,需要使用ref属性获取el-upload组件的实例,然后调用submit方法上传文件和sha256。
阅读全文