javascript - 在上传循环期间获取字节位置

标签 javascript jquery ajax filereader arraybuffer

我正在开发一个函数,该函数将使用第 3 方 API 将数据分块写入远程服务器。通过 Stack Overflow 上的一些帮助,我能够完成此任务,现在它正在按预期工作。问题是我只能写入一个 16kb 的 block ,因为我需要提前写入下一个字节的位置的 pos

初始写入很容易从 0 开始。由于我对此不熟悉,我不确定下一个 pos 应该只是 16 还是什么。如果有帮助,API 调用 writeFileChunk() 需要 3 个参数,文件路径 (str)、pos (int64) 和数据(base64 编码字符串)。

    reader.onload = function(evt)
    {
        // Get SERVER_ID from URL
        var server_id = getUrlParameter('id');

        $("#upload_status").text('Uploading File...');
        $("#upload_progress").progressbar('value', 0);

        var chunkSize = 16<<10;
        var buffer = evt.target.result;
        var fileSize = buffer.byteLength;
        var segments = Math.ceil(fileSize / chunkSize); // How many segments do we need to divide into for upload
        var count = 0;

        // start the file upload
        (function upload()
        {
            var segSize = Math.min(chunkSize, fileSize - count * chunkSize);

            if (segSize > 0)
            {
                $("#upload_progress").progressbar('value', (count / segments));

                var chunk = new Uint8Array(buffer, count++ * chunkSize, segSize); // get a chunk
                var chunkEncoded = btoa(String.fromCharCode.apply(null, chunk));

                // Send Chunk data to server
                $.ajax({
                    type: "POST",
                    url: "filemanagerHandler.php",
                    data: { 'action': 'writeFileChunk', 'server_id': server_id, 'filepath': filepath, 'pos': 0, 'chunk': chunkEncoded },
                    dataType: 'json',
                    success: function(data)
                    {
                        console.log(data);
                        setTimeout(upload, 100);
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown)
                    {
                        alert("Status: " + textStatus); alert("Error: " + errorThrown); alert("Message: " + XMLHttpRequest.responseText);
                    }
                });
            }
            else
            {
                $("#upload_status").text('Finished!');
                $("#upload_progress").progressbar('value', 100);

                getDirectoryListing(curDirectory);
            }
        })()
    };

最佳答案

文件在客户端的当前位置将由这一行表示,或者更具体地说是预增量步骤中的第二个参数:

var chunk = new Uint8Array(buffer, count++ * chunkSize, segSize);

不过,在这种情况下,它会在您重新使用它之前前进 (count++),因此如果您需要实际位置(下面是 pos),您可以通过简单地提取它将该行重写为:

var pos = count++ * chunkSize;   // here chunkSize = 16kb
var chunk = new Uint8Array(buffer, pos, segSize);

这里每个位置更新将增加 16kb,因为这是 block 大小。对于进度,则计算 pos/fileSize * 100。这当然假设使用未编码的缓冲区大小。

唯一的特殊情况是最后一个 block ,但是当没有更多 block 可供读取时,位置应该等于文件长度 (fileSize),所以它应该非常简单。

当 ajax 调用返回时,服务器应该有相同的位置,除非出现错误(连接、写访问更改、磁盘已满等)。

关于javascript - 在上传循环期间获取字节位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41039649/

相关文章:

javascript - 取消选择特定 div 内除选中的复选框之外的所有复选框

javascript - PHP 和 JavaScript 源代码,字符串比较错误

javascript - 使数据表中的行可点击

javascript - "Function factory"似乎不起作用,JavaScript

javascript - Firefox jquery position() 关闭 1px

javascript - 我的 Ajax PHP 代码无法正常工作

php - 使用 ajax 和 php 时的用户身份验证和重定向

javascript - Codecademy Javascript ...以及良好的!/正确的输出,但 Codecademy 不喜欢它

JavaScript 警报消息和程序流程

javascript - 我应该在浏览器内存中缓存多少数据有限制吗?