Я работаю над функцией, которая будет записывать данные на удаленный сервер в куски, используя сторонний API. Через некоторую помощь в Qaru я смог выполнить это, где он теперь работает, как ожидалось. Проблема в том, что я могу получить только один 16kb кусок для записи, поскольку мне нужно будет продвинуть 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);
            }
        })()
    };
