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; }
// 同時リクエスト時の排他制御 // プロセスが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()); }
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(); }