public async Task <UploadContextModel> UploadChunkAsync( UploadContextModel uploadContext, long from, long to, Stream inputStream, int chunkIndex, CancellationToken cancellationToken = default(CancellationToken) ) { var uploadStateToken = UploadTokenModel.Parse(uploadContext.UploadToken); var fileLocator = await FileStore.FileLocatorGetAsync(uploadStateToken.Identifier); var uploadChunk = new UploadChunkModel { Identifier = new UploadChunkIdentifier(uploadStateToken.Identifier, fileLocator + '.' + chunkIndex.ToString()), ChunkIndex = chunkIndex, PositionFrom = from, PositionTo = to }; uploadContext.SequentialState = await BackendClient.UploadChunkAsync( await LoadConfigurationAsync(uploadStateToken.Identifier as OrganizationIdentifier), uploadStateToken.Identifier.UploadKey, fileLocator, uploadChunk.Identifier.UploadChunkKey, chunkIndex, uploadContext.TotalChunks, uploadContext.SequentialState, uploadChunk.PositionFrom, uploadChunk.PositionTo, uploadContext.FileLength, inputStream, cancellationToken ); uploadChunk.State = uploadContext.SequentialState; uploadChunk.Success = true; await UploadChunkStore.InsertAsync(uploadChunk); return(uploadContext); }
public async Task <FileModel> UploadCompleteAsync( UploadContextModel uploadContext, CancellationToken cancellationToken = default(CancellationToken) ) { var uploadStateToken = UploadTokenModel.Parse(uploadContext.UploadToken); var upload = await UploadStore.GetOneAsync(uploadStateToken.Identifier, new[] { new PopulationDirective { Name = nameof(UploadModel.Chunks) } }); var chunkStates = upload.Chunks?.Rows .OrderBy(c => c.ChunkIndex) .Select(c => new ChunkedStatusModel { ChunkIndex = c.ChunkIndex, UploadChunkKey = c.Identifier.UploadChunkKey, State = c.State, Success = true }) .ToArray(); var fileLocator = await FileStore.FileLocatorGetAsync(uploadStateToken.Identifier); var returnData = await BackendClient.CompleteChunkedUploadAsync( await LoadConfigurationAsync(uploadStateToken.Identifier as OrganizationIdentifier), uploadStateToken.Identifier.UploadKey, fileLocator, chunkStates ); var fileModel = await FileStore.GetOneAsync(uploadStateToken.Identifier); await FileStore.UpdateAsync(fileModel); if (returnData != null) { await FileStore.HashSetAsync( fileModel.Identifier, GetHash(returnData, "md5"), GetHash(returnData, "sha1"), GetHash(returnData, "sha256") ); } await FileStore.UploadingStatusSetAsync(fileModel.Identifier, false); await UploadStore.Cleanup(upload.Identifier); var evt = new FileContentsUploadCompleteEvent { FileIdentifier = fileModel.Identifier }; evt.Populate(fileModel); await EventSender.SendAsync(evt); return(fileModel); }
public List <MediaItemCreate> Post(MediaItemRequest mediaItemRequest) { string token = Request.Headers.Authorization.Parameter; List <UploadTokenModel> uploadTokens = new List <UploadTokenModel>(); string APIURL = WebConfigurationManager.AppSettings["googleApiURL"]; int batchSize = Convert.ToInt32(WebConfigurationManager.AppSettings["batchSize"]); MediaItemCreate response = new MediaItemCreate(); List <MediaItemCreate> responses = new List <MediaItemCreate>(); if (token == string.Empty) { NewMediaItemResult newMediaItemResult = new NewMediaItemResult() { Status = new Status() { Message = "Token Is Empty" } }; response.NewMediaItemResults.Add(newMediaItemResult); responses.Add(response); return(responses); } List <Task> task = new List <Task>(); foreach (MediaItems mediaItem in mediaItemRequest.MediaItems) { var runningTask = Task.Run(() => { WebClient wc = new WebClient(); string url = mediaItem.BaseUrl + "=w" + mediaItem.MediaMetadata.Width + "-h" + mediaItem.MediaMetadata.Height; byte[] imageBytes = wc.DownloadData(new Uri(url)); UploadTokenModel uploadToken = new UploadTokenModel() { Description = mediaItem.Filename, UploadToken = GetUploadToken("POST", APIURL + "uploads", token, mediaItem.Filename, imageBytes).Content }; uploadTokens.Add(uploadToken); }); task.Add(runningTask); } Task.WaitAll(task.ToArray()); BatchCreateModel batchCreateModel = new BatchCreateModel() { AlbumId = mediaItemRequest.AlbumId, NewMediaItems = new List <NewMediaItem>() }; UploadTokenModel lastElement = uploadTokens.Last(); foreach (UploadTokenModel uploadToken in uploadTokens) { NewMediaItem newMedia = new NewMediaItem() { Description = uploadToken.Description, SimpleMediaItem = new SimpleMediaItem() }; newMedia.SimpleMediaItem.UploadToken = uploadToken.UploadToken; batchCreateModel.NewMediaItems.Add(newMedia); if (batchCreateModel.NewMediaItems.Count % 50 == 0 || uploadToken.Equals(lastElement)) { response = UploadMedia(APIURL + "mediaItems:batchCreate", token, batchCreateModel, mediaItemRequest.AlbumId); responses.Add(response); batchCreateModel.NewMediaItems = new List <NewMediaItem>(); } } return(responses); }