如何使用 blueimp jquery 上传插件获取每个块的 md5 迭代 md5 总和
How to get md5 iterated md5 sum of every chunk, using blueimp jquery upload plugin
我需要计算并发送一个迭代的 md5-hash 到我的上传-api。
但是我不知道怎么办。
我正在使用此处找到的教程:
连同 blueimp jquery 上传插件。
仅发送一个文件(文件大小小于块大小),一切正常。但是,如果一个文件被分块,那么我不知道如何捕获该块以获取它的 md5。
最后,我必须像这里描述的那样迭代地制作 md5:
$('#upload').fileupload({
// This element will accept file drag/drop uploading
dropZone: $('#drop'),
type : GLOBAL_FORM_METHOD,
method : "post", // Type of data-send-method
dataType : "json", // Type of data to recieve from api-call
maxChunkSize: GLOBAL_CHUNK_SIZE,
multipart : true,
// This function is called when a file is added to the queue;
// either via the browse button, or via drag/drop:
add: function (e, data)
{
var reader = new FileReader();
var file = data.files[0];
var jqXHR;
var tpl = $('<li class="working"><input type="text" value="0" data-width="48" data-height="48"'+
' data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" /><p></p><div class="msg"></div><span></span></li>');
// Append the file name and file size
tpl.find('p')
.text( file.name )
.append('<i>' + formatFileSize( file.size ) + '</i>');
// Add the HTML to the UL element
data.context = tpl.appendTo(ul);
// Initialize the knob plugin
tpl.find('input').knob();
// Listen for clicks on the cancel icon
tpl.find('span').click(function()
{
if( tpl.hasClass('working') )
{
jqXHR.abort();
}
tpl.fadeOut( function()
{
tpl.remove();
});
});
// Prevent XHR from sending data in "multipart/formData"
data.postMessage = data.files[0].type;
data.contentType = data.files[0].type;
var chunksize = GLOBAL_CHUNK_SIZE > file.size ? file.size : GLOBAL_CHUNK_SIZE;
// Describe the FileReader-DataLoad-Event
reader.onload = function( event )
{
var binary = event.target.result;
var md5 = CryptoJS.MD5(binary).toString();
data.url += "&md5sum=" + md5;
// D A T A S E N D
jqXHR = data.submit();
};
// ADD url to XHR-object
data.url = GLOBAL_FORM_ACTION;
data.url += "?etf_id=" + GLOBAL_FOLDER_ID;
data.url += "&file_title=" + file.name;
// If the file will be send in one piece...
if( GLOBAL_CHUNK_SIZE > file.size )
{
// ADD url-parameter to XHR-object
data.url += "&size_chunk_start=" + 0;
data.url += "&size_chunk_length=" + chunksize;
}
// This part for the chunks must be in "beforeSend"-Callback,
// because, the chunk-related size-data is undefined in this case
// but available there.
// ADD url-parameter to XHR-object
data.url += "&size_final=" + file.size;
// Read md5-sum and send the file / chunk...
// On multipart "file" is a chunk !
reader.readAsBinaryString( file );
},
beforeSend : function(e, data)
{
var file = data.files[0];
this.find(".msg").hide();
// If the file will be send as chunks...
if( GLOBAL_CHUNK_SIZE < file.size )
{
console.log( "Chunk data: ", data.uploadedBytes, data.chunkSize, file.size, data );
// ADD url-parameter to XHR-object
data.url += "&size_chunk_start=" + data.uploadedBytes;
data.url += "&size_chunk_length=" + data.chunkSize;
if( typeof this.attr('session_id') !== "undefined" )
data.url += "&session_id=" + this.attr( 'session_id' );
}
});
希望大家帮忙,我自己解决。
This answer to a similar question 提供了一种实现此目的的方法。还有一些库可以为你做这件事,比如 CryptoJS
要点是用 0 字节填充文件以达到可被块长度整除的特定长度,然后将数据逐块读入缓冲区,并获得该数据。然后,为您读取的每个块附加该散列。
我需要计算并发送一个迭代的 md5-hash 到我的上传-api。 但是我不知道怎么办。
我正在使用此处找到的教程:
连同 blueimp jquery 上传插件。
仅发送一个文件(文件大小小于块大小),一切正常。但是,如果一个文件被分块,那么我不知道如何捕获该块以获取它的 md5。
最后,我必须像这里描述的那样迭代地制作 md5:
$('#upload').fileupload({
// This element will accept file drag/drop uploading
dropZone: $('#drop'),
type : GLOBAL_FORM_METHOD,
method : "post", // Type of data-send-method
dataType : "json", // Type of data to recieve from api-call
maxChunkSize: GLOBAL_CHUNK_SIZE,
multipart : true,
// This function is called when a file is added to the queue;
// either via the browse button, or via drag/drop:
add: function (e, data)
{
var reader = new FileReader();
var file = data.files[0];
var jqXHR;
var tpl = $('<li class="working"><input type="text" value="0" data-width="48" data-height="48"'+
' data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" /><p></p><div class="msg"></div><span></span></li>');
// Append the file name and file size
tpl.find('p')
.text( file.name )
.append('<i>' + formatFileSize( file.size ) + '</i>');
// Add the HTML to the UL element
data.context = tpl.appendTo(ul);
// Initialize the knob plugin
tpl.find('input').knob();
// Listen for clicks on the cancel icon
tpl.find('span').click(function()
{
if( tpl.hasClass('working') )
{
jqXHR.abort();
}
tpl.fadeOut( function()
{
tpl.remove();
});
});
// Prevent XHR from sending data in "multipart/formData"
data.postMessage = data.files[0].type;
data.contentType = data.files[0].type;
var chunksize = GLOBAL_CHUNK_SIZE > file.size ? file.size : GLOBAL_CHUNK_SIZE;
// Describe the FileReader-DataLoad-Event
reader.onload = function( event )
{
var binary = event.target.result;
var md5 = CryptoJS.MD5(binary).toString();
data.url += "&md5sum=" + md5;
// D A T A S E N D
jqXHR = data.submit();
};
// ADD url to XHR-object
data.url = GLOBAL_FORM_ACTION;
data.url += "?etf_id=" + GLOBAL_FOLDER_ID;
data.url += "&file_title=" + file.name;
// If the file will be send in one piece...
if( GLOBAL_CHUNK_SIZE > file.size )
{
// ADD url-parameter to XHR-object
data.url += "&size_chunk_start=" + 0;
data.url += "&size_chunk_length=" + chunksize;
}
// This part for the chunks must be in "beforeSend"-Callback,
// because, the chunk-related size-data is undefined in this case
// but available there.
// ADD url-parameter to XHR-object
data.url += "&size_final=" + file.size;
// Read md5-sum and send the file / chunk...
// On multipart "file" is a chunk !
reader.readAsBinaryString( file );
},
beforeSend : function(e, data)
{
var file = data.files[0];
this.find(".msg").hide();
// If the file will be send as chunks...
if( GLOBAL_CHUNK_SIZE < file.size )
{
console.log( "Chunk data: ", data.uploadedBytes, data.chunkSize, file.size, data );
// ADD url-parameter to XHR-object
data.url += "&size_chunk_start=" + data.uploadedBytes;
data.url += "&size_chunk_length=" + data.chunkSize;
if( typeof this.attr('session_id') !== "undefined" )
data.url += "&session_id=" + this.attr( 'session_id' );
}
});
希望大家帮忙,我自己解决。
This answer to a similar question 提供了一种实现此目的的方法。还有一些库可以为你做这件事,比如 CryptoJS
要点是用 0 字节填充文件以达到可被块长度整除的特定长度,然后将数据逐块读入缓冲区,并获得该数据。然后,为您读取的每个块附加该散列。