Я реализую функцию загрузки чанка для функции загрузки вложений проекта веб-сайта 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;
}
}
Нет исключений из кода.
Есть идеи, почему метод действия не получает другие фрагменты файла?