Загрузка чанк-интерфейса пользовательского интерфейса в Microsoft Azure - PullRequest
0 голосов
/ 14 сентября 2018

Я реализую функцию загрузки чанка для функции загрузки вложений проекта веб-сайта ASP.Net Core.В настоящее время загрузка файла обрабатывается библиотекой пользовательского интерфейса Kendo, но текущая реализация не поддерживает загрузку фрагментов.Вложения будут загружены в BLOB-объект Azure.

Я следовал приведенным в библиотеке примерам, но мой контроллер ASP.Net получает только первый фрагмент файла загрузки, фрагменты не приходят.

Сторона Клинта:

    $("#xyzUpload").kendoUpload({
    async: {
        saveUrl: fileUploadUrl,
        chunkSize: 1048576,
        removeUrl: "remove",
        autoUpload: true
    },
    multiple: true,
    upload: function (e) {
        e.data = { id: $("#fileUplpderParentObjectId").val() };
    },
    showFileList: false,
    dropZone: ".abc",
    success: onSuccess
});

Действие контроллера:

 [HttpPost]
    public async Task<JsonResult> ChunkUpload(IEnumerable<IFormFile> files, string metaData, Guid id)
    {
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(metaData));

        JsonSerializer serializer = new JsonSerializer();
        ChunkMetaData chunkData;

        var userId = _userManager.GetUserId(User);
        var fileList = new List<GeneralFileViewModel>();

        using (StreamReader streamReader = new StreamReader(ms))
        {
            chunkData = (ChunkMetaData)serializer.Deserialize(streamReader, typeof(ChunkMetaData));
        }

        if (files != null)
        {
            foreach (var file in files)
            {
                var extension = Path.GetExtension(chunkData.FileName);
                var fileName = Path.GetFileNameWithoutExtension(chunkData.FileName);
                var guid = Guid.NewGuid();
                var generalFile = new GeneralFileViewModel()
                {
                    FileId = guid,
                    FileName = fileName,
                    Extension = extension,
                    //FileType = _jobsservice.GetFileType(extension),
                    ParentId = id
                };

                var blockId = Convert.ToBase64String(BitConverter.GetBytes(chunkData.ChunkIndex));

                //Write chunk to azure blob block
                await _uploadService.UploadInBlocksToAzure(blockId, generalFile, file.OpenReadStream());

                //if last chunk is uploaded, commit the blob into azure
                //await _uploadService.CommitBlocksToAzure();

                fileList.Add(generalFile);
            }
        }
        return Json(fileList);
    }

Метод UploadInBlocksToAzure ()

public async Task UploadInBlocksToAzure(string id, GeneralFileViewModel file, Stream stream)
    {
        try
        {
            var storageAccount = CloudStorageAccount.Parse(_connectionString);
            CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();

            var container = cloudBlobClient.GetContainerReference("test-video-in");
            var blob = container.GetBlockBlobReference(file.FileId + file.Extension);
            await blob.PutBlockAsync(id, stream, null);
        }
        catch (Exception e)
        {
            throw;
        }
    }

Нет исключений из кода.

Есть идеи, почему метод действия не получает другие фрагменты файла?

1 Ответ

0 голосов
/ 14 сентября 2018

Важно вернуть объект JSON со свойствами uploaded и fileUid, который уведомляет клиента о том, каким должен быть следующий чанк, как описано здесь - https://docs.telerik.com/kendo-ui/api/javascript/ui/upload/configuration/async.chunksize Вы также можете увидеть, как он работает правильно в этой демонстрациив методе ChunkSave - https://demos.telerik.com/kendo-ui/upload/chunkupload

...