Как загрузить большой файл кусками, используя html5 File API? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть код ниже, чтобы нарезать файл и вызывать Web API для каждого фрагмента данных для загрузки. Как я могу включить большой двоичный объект (байты, полученные из file.slice ()) в ajax POST, чтобы я мог получить его как httpRequest.Form.Files [0] на стороне сервера? Спасибо!

    function Upload() {
    reader = new FileReader();
    file = document.querySelector('#file-upload').files[0];
    upload_file(0);
}

function upload_file(start) {
    var next_slice = start + slice_size + 1;
    var blob = file.slice(start, next_slice);

    reader.onloadend = function(event) {
        if (event.target.readyState !== FileReader.DONE) {
            return;
        }

        //var imageData = new FormData($('#frmFile')[0]);

        var imageData = new FormData();
        imageData.append("additionalData", "1234567");

        $.ajax( {
            url: 'http://localhost:58373/AddFileAPI/AddFile',
            type: 'POST',
            cache: false,
            data: imageData,

            //data: blob,
            contentType: false,
            processData: false,
            crossDomain: true,
            xhrFields: { withCredentials: true },

            error: function(jqXHR, textStatus, errorThrown) {
                console.log(jqXHR, textStatus, errorThrown);
            },
            success: function(data) {
                var size_done = start + slice_size;
                var percent_done = Math.floor((size_done / file.size) * 100);

                if (next_slice < file.size) {
                    // More to upload, call function recursively
                    upload_file(next_slice);
                } else {
                    alert('Upload complete');
                }
            }
        } );
    };

    //reader.readAsDataURL(blob);
    reader.readAsBinaryString(blob);
}

Ниже представлен API, который считывает байты файла и добавляет его в файл на диске. Требуется FileName и поток файлов.

[HttpPost]
[Route("AddFile")]
public ActionResult AddFile()
{
    var request = HttpContext.Request;  
    var file = request.Form.Files[0];
    var inputStream = file.OpenReadStream();

    string additionalData = request.Form["additionalData"];

    var fullName = Path.Combine(serverPath, Path.GetFileName(file.FileName));

    using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write))
    {
        var buffer = new byte[1024];

        var l = inputStream.Read(buffer, 0, 1024);
        while (l > 0)
        {
            fs.Write(buffer, 0, l);
            l = inputStream.Read(buffer, 0, 1024);
        }
        fs.Flush();
        fs.Close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...