利用文件名md5值实现秒传功能

1,454 阅读1分钟

通过js-spark-md5获取文件的md5值实现秒传功能,demo地址:9px.ir/demo/increm…

以下是实现方法:

// 判断文件是否是视频(有些视频 无法识别,当文件处理,如flv等)
export function fileIsVideo(filename) {  
    if(typeof filename !== 'string' || !filename) {    
        console.error('文件名/文件类型 参数必须存在且为字符串类型')    
        return ''  
    }  
    let lowerName = filename.toLowerCase()  
    /**   * 针对部分 系统无法播放的 部分格式视频,当文件处理(mov,flv等格式)   */  
    return /[.](mp4|mov|rmvb|avi|ogg)$/.test(lowerName)
}

// 判断文件是否是图片
export function fileIsImg(filename) {  
    if(typeof filename !== 'string' || !filename) {    
        console.error('文件名/文件类型 参数必须存在且为字符串类型')    
        return ''  
    }  
    let lowerName = filename.toLowerCase()  
    return /[.](png|jpg|jpeg|gif|bmp|svg|webp)$/.test(lowerName)
}

import SparkMD5 from 'spark-md5'
export const getMediaInfo = (files, callback) => {  
    const fileList = [...files]  
    fileList.forEach(fileItem => {    
        if(fileIsImg(fileItem.name)) {      
            fileItem = getFileMD5(fileItem, 1)    
        } else if(fileIsVideo(fileItem.name)) {      
            fileItem = getFileMD5(fileItem, 2)    
        } else {      
            // 非视频 非图片文件      
            fileItem = getFileMD5(fileItem, 0)    
        }  
    })
    return fileList
}

/** * 获取文件的MD5值 
    * @param { File } file 文件原生信息 
    * @param { Number } type 0-文件类型 1-图片类型 2-视频格式 
    * @param { Number } chunkSize 块的大小 
    */
function getFileMD5(file, type = 0, chunkSize = 4000000) {  
    console.log('getFileMD5Info:', file, type)  
    const fileReader = new FileReader()  
    let currentChunk = 0  
    let spark = new SparkMD5.ArrayBuffer()  
    let chunks = Math.ceil(file.size / chunkSize)  
    let blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice  
    fileReader.onload = function(e) {        
        let fileResult = e.target.result    
        spark.append(fileResult)    
        currentChunk ++    
        if(type === 1) {      
            const img = new Image()  
            img.src = fileResult        
            img.onload = function() {          
                file.width = img.width          
                file.height = img.height        
            }      
            file.src = getObjectURL(file)    
        } else if(type === 2) {      
            const video = document.createElement('video')      
            video.src = fileResult      
            video.onloadeddata = function(evt) {        
                console.log('duration:', video.duration, evt)        
                file.duration = video.duration        
                file.width = this.videoWidth        
                file.height = this.videoHeight      
            }    
        }    
        if(currentChunk < chunks) {      
            loadNext()    
        } else {            
            let fileMd5 = spark.end()      
            file.fileMd5 = fileMd5      
            console.log('computed hash:', currentChunk, fileMd5)      
            console.log('computed fileMd5:', file)      
            return file    
        }  
    }  
    loadNext()  
    function loadNext() {    
        let start = currentChunk * chunkSize    
        let end = (start + chunkSize) >= file.size ? file.size : (start + chunkSize)    
        fileReader.readAsArrayBuffer(blobSlice.call(file, start, end))  
    }
}

附:

windows电脑查看系统文件的md5值:

1. 打开cmd,

2.输入命令: certutil -hashfile 文件路径 MD5 ,如 certutil -hashfile D:\1.exe MD5

亦可查看其他加密模式

certutil -hashfile D:\1.exe SHA1     // SHA1
certutil -hashfile D:\1.exe SHA256    // SHA256

MAC电脑:

1.打开terminal,

2. 输入命令 md5 文件名   , 如 md5 /Users/channe/Downloads/md5file.JPG