示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }