我有一个具有文件上传功能的网页。上传以 5MB 块执行。我想在将每个块发送到服务器之前计算其哈希值。块由Blob对象表示。为了计算哈希值,我使用本机FileReader将此类 blob 读取到ArrayBuffer中。这是代码:
var reader = new FileReader();
var getHash = function (blob, callback) {
reader.onloadend = function (e) {
var hash = util.hash(e.target.result);
callback(hash);
};
reader.readAsArrayBuffer(blob);
}
var processChunk = function (chunk) {
if (chunk) {
getHash(chunk, function (hash) {
util.sendToServer(chunk, hash, function() {
// this callback is called when chunk upload is finished
processChunk(chunks.shift());
});
});
}
}
var chunks = file.splitIntoChunks(); // gets an array of blobs
processChunk(chunks.shift());
Run Code Online (Sandbox Code Playgroud)
问题:使用FileReader.readAsArrayBuffer …
我正在尝试将一些数据从 MSSQL 移动到 MySQL。当我wbcopytables.exe在 mysql 连接上运行字符集似乎是错误的时,当数据包含表情符号图标时我收到错误(http://apps.timwhitlock.info/unicode/inspect?s=%F0%9F%8C %A8%E2%98%83%EF%B8%8F):
Incorrect string value: '\xF0\x9F\x8C\xA8\xE2\x98...' for column 'Value' at row 4
Run Code Online (Sandbox Code Playgroud)
我的服务器、数据库、表和列都有charset=utf8mb4和collation=utf8mb4_unicode_ci。不过,我可以使用我在旁边创建的 .NET 应用程序将这些表情符号图标插入到该表中,因此这不是架构/服务器设置的问题。这让我认为wbcopytables.exe在连接上强制执行一些其他编码(可能是 utf8)。我尝试更改所有 mysql 变量以强制执行 utf8mb4,如 my.ini 中的其他 SO 问题中所建议的那样:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET collation_connection = utf8mb4_unicode_ci'
skip-character-set-client-handshake
Run Code Online (Sandbox Code Playgroud)
编辑:以下是有关 wbcopytables.exe 本身的更多信息: https: //dev.mysql.com/doc/workbench/en/wbcopytables.html
我正在实现一个基于浏览器的分块文件上传器。要打开我正在使用的文件<input type="file" id="fileSelector" />和这段代码(简化):
$('#fileSelector').on('change', function () {
_file = evt.target.files[0];
});
Run Code Online (Sandbox Code Playgroud)
我将文件切成块,但没有将块读入内存(不明确)。
问题:偶尔(对于上传文件的不到 0.1%)从底层文件切下的块是空的。例如,在上传大文件期间一切顺利,然后在该文件调用的中间:
var _blob = _file.slice(chunk.start, chunk.end, _file.type);
Run Code Online (Sandbox Code Playgroud)
结果是一个空切片(_blob.size为 0)。将此类 blob 发送到服务器 (.NET 4.6) 会导致Request.InputStream空值。我正在发送二进制数据:
_xhr.setRequestHeader('content-type', 'application/octet-stream');
_xhr.send(_blob);
Run Code Online (Sandbox Code Playgroud)
我还应该提到,_file.slice再次调用会产生相同的空 blob。我可以在 Chrome 57、Chrome 60(Win 和 Mac)、Mac Safari 10.1.1 和 Edge 15 中观察到这一点。其他浏览器也是可能的。
有什么问题吗?我正在考虑的事情:
javascript ×2
chunking ×1
file-upload ×1
filereader ×1
html ×1
memory ×1
memory-leaks ×1
mysql ×1