Exemplo n.º 1
0
        public async Task <ApiResponse <PutResult <Guid> > > Put([FromBody] BlobInputDto dto)
        {
            var key = await _blobService.Put(dto);

            var result = new PutResult <Guid>(key);

            return(ApiResponse.OK(result));
        }
Exemplo n.º 2
0
        private BlobInputDto GetLargeBlob()
        {
            var dto = new BlobInputDto();

            dto.TimeStamp = Mapper.Map <DateTime, long>(DateTime.UtcNow);
            dto.Remark    = "large blob";
            var body = new byte[BlobEntity.BlobChunkSize * 8 + 100];

            RandomUtils.GetRandomInstance().NextBytes(body);
            dto.Body = Mapper.Map <byte[], string>(body);
            return(dto);
        }
Exemplo n.º 3
0
        public async Task <Guid> Put(BlobInputDto dto)
        {
            // 获取提交过来的内容, 计算校验值
            var originalBytes = Mapper.Map <string, byte[]>(dto.Body);

            if (dto.IsCompressed)
            {
                originalBytes = ArchiveUtils.DecompressFromGZip(originalBytes);
            }
            var hash = HashUtils.GetSHA256Hash(originalBytes);

            using (var transaction = await _repository.BeginTransactionAsync())
            {
                // 如果有相同校验值的blob, 返回该blob
                var existBlobId = await _repository.QueryNoTrackingAsync(q =>
                                                                         q.Where(x => x.BodyHash == hash)
                                                                         .Select(x => x.BlobId)
                                                                         .FirstOrDefaultAsyncTestable());

                if (existBlobId != Guid.Empty)
                {
                    return(existBlobId);
                }
            }
            // 对内容进行分块
            var blobId = PrimaryKeyUtils.Generate <Guid>();
            var chunks = SplitChunks(blobId, originalBytes, hash, dto.Remark, dto.TimeStamp);

            // 添加新的blob
            // 注意并发添加时可能会添加相同内容的blob
            using (var transaction = await _repository.BeginTransactionAsync())
            {
                foreach (var chunk in chunks)
                {
                    // 这里需要逐个分块提交, 否则会触发mysql的max_allowed_packet错误
                    await _repository.AddAsync(chunk);

                    await _repository.SaveChangesAsync();
                }
                transaction.Commit();
            }
            return(blobId);
        }
Exemplo n.º 4
0
 public Task <long> Patch(Guid key, BlobInputDto dto)
 {
     return(Patch(x => x.BlobId == key, dto));
 }
Exemplo n.º 5
0
 public Task <long> Patch(Expression <Func <BlobEntity, bool> > expression, BlobInputDto dto)
 {
     throw new NotSupportedException("modify an exist blob without changing it's blob id is dangerous and unsupported");
 }