public StorageEntry AddEntry(StorageEntry entry)
        {
            AssertContainerExist();
            var path = Path.Combine(_storagePath, entry.Name);

            // 本体作成
            CreateFile(path, entry.Contents);

            return this.ToStorageEntry(path);
        }
        public StorageEntry AddEntry(StorageEntry entry)
        {
            // 本体作成
            using (var stream = new MemoryStream(entry.Contents))
            {
                var request = new PutObjectRequest { InputStream = stream };
                request.WithBucketName(BucketName)
                       .WithKey(entry.Name)
                       .WithContentType(entry.ContentType);

                using (var s3 = GetAmazonS3())
                {
                    var response = s3.PutObject(request);
                    response.Dispose();
                }
            }

            return entry;
        }
        public static StorageEntry ToStorageEntry(this IStorageProvider provider, string path)
        {
            if (!File.Exists(path))
                return null;

            var fileInfo = new FileInfo(path);
            var fileName = fileInfo.FullName.Replace(provider.LocalStoragePath, "").Replace("\\", "/").TrimStart('/');
            var contentType = provider.ContentTypeFromExtension(Path.GetExtension(fileName));
            var entry = new StorageEntry
                            {
                                Name = fileName,
                                ContentType = contentType,
                                Length = fileInfo.Length,
                                Timestamp = fileInfo.LastWriteTime,
                                Contents = new byte[fileInfo.Length],
                            };

            using (var stream = fileInfo.Open(FileMode.Open,FileAccess.Read, FileShare.None))
            {
                stream.Read(entry.Contents, 0, entry.Contents.Length);
            }

            return entry;
        }
Example #4
0
        // 同時リクエスト時の排他制御
        // プロセスが1つでもリクエストは同時にくるからね!Worker Processが複数なら違う方法も考えましょう。
        public void Upload(string uploadingPath)
        {
            var uploading = _repository.UploadingPhotos();

            // ここは非同期にしてもしなくてもどっちでも~。
            // 同時にたくさんのファイルアップロードがあって、パフォーマンス問題が起きるなら
            // 非同期にするのを考えればいいんじゃないかな。コンカレントだし。

            //var tasks = new List<Task>();
            foreach (var photo in uploading)
            {
                // 処理
                //var task = Task.Factory.StartNew(photoId =>
                //{
                Trace.WriteLine(" uploading - " + photo.Id + " : " + DateTime.Now);
                var entry = new StorageEntry(photo);
                entry.Load(uploadingPath);

                // Provider使ってファイル保存
                _storage.AddEntry(entry);

                // 保存済み
                _repository.UploadedPhoto(photo.Id);
                _repository.SaveChanges();

                // 一時ファイルの削除
                entry.Delete(uploadingPath);

                Trace.WriteLine(" uploaded - " + photo.Id + " : " + DateTime.Now);

                //}, up.Id);
                //tasks.Add(task);
            }
            //Task.WaitAll(tasks.ToArray());
        }
Example #5
0
        public Stream GetImage(Photo photo, ResizeMode type, int size)
        {
            // クラウドに送り込んだ?
            if (!photo.IsUploaded)
                return null;

            // 処理中?
            //if (!_processing.Lock(photo.Id))
            //{
            //    var dump = string.Format("[id = {0}, type = {1}, size = {2}]", photo.Id, type, size);
            //    Trace.WriteLine(" can't get lock - " + dump + " : " + DateTime.Now);
            //    return null;
            //}

            // ファイルがあるなら即返す
            var loadName = GenerateFileName(photo.FileName, type, size);
            var loadPath = CacheFullPath(loadName);
            var entry = new StorageEntry(photo);
            var resizer = new ImageResizer();
            if (!File.Exists(loadPath))
            {
                // キャッシュになければStorageから取り出す。
                var cacheName = RetrieveCache(photo.FileName);
                if (string.IsNullOrEmpty(cacheName))
                    return null;

                // 最適化して回転する
                var optName = GenerateFileName(photo.FileName, ResizeMode.Optimize);
                var optPath = CacheFullPath(optName);
                resizer.Optimize(cacheName, optPath);

                // ローカルキャッシュにリサイズしたものを取得
                GenerateResize(optPath, loadName, type, size);
            }
            //_processing.Unlock(photo.Id);

            var bytes = entry.Load(CachePath, loadName);

            return bytes == null ? null : new MemoryStream(bytes);
        }
 public StorageEntry AddEntry(StorageEntry entry)
 {
     throw new NotImplementedException();
 }