2012-11-19 9 views
5

Bu sorunun arka planı geliştirdiğim sanal dosya sistemine dayanmaktadır. Kullandığım kavram, farklı dosya türleri için yerel dosya sistemi, dropbox ve amazon s3 için virutal yol sağlayıcılarıdır. Sanal bir dosya için My taban sınıfı şöyle görünür:Bir sanal yol sağlayıcısı ve Amazon S3 SDK kullanarak dosya yükleme

public abstract class CommonVirtualFile : VirtualFile { 
    public virtual string Url { 
     get { throw new NotImplementedException(); } 
    } 
    public virtual string LocalPath { 
     get { throw new NotImplementedException(); } 
    } 
    public override Stream Open() { 
     throw new NotImplementedException(); 
    } 
    public virtual Stream Open(FileMode fileMode) { 
     throw new NotImplementedException(); 
    } 
    protected CommonVirtualFile(string virtualPath) : base(virtualPath) { } 
} 

ikinci Açık yöntemin uygulanması benim sorum tüm hakkında ne olduğunu. yerel dosya sistemi için benim uygulanması bakarsanız diskteki bir dosyaya kaydedip yani o şuna benzer: Ben yerel dosya sistemindeki bir dosyayı kaydetmek isterseniz

public override Stream Open(FileMode fileMode) { 
    return new FileStream("The_Path_To_The_File_On_Disk"), fileMode); 
} 

bu şuna benzer olacaktır:

const string virtualPath = "/assets/newFile.txt"; 
    var file = HostingEnvironment.VirtualPathProvider.GetFile(virtualPath) as CommonVirtualFile; 
    if (file == null) { 
     var virtualDir = VirtualPathUtility.GetDirectory(virtualPath); 
     var directory = HostingEnvironment.VirtualPathProvider.GetDirectory(virtualDir) as CommonVirtualDirectory; 
     file = directory.CreateFile(VirtualPathUtility.GetFileName(virtualPath)); 
    } 
    byte[] fileContent; 
    using (var fileStream = new FileStream(@"c:\temp\fileToCopy.txt", FileMode.Open, FileAccess.Read)) { 
     fileContent = new byte[fileStream.Length]; 
     fileStream.Read(fileContent, 0, fileContent.Length); 
    } 
    // write the content to the local file system 
    using (Stream stream = file.Open(FileMode.Create)) { 
     stream.Write(fileContent, 0, fileContent.Length); 
    } 

istediğim şey olmalıdır amazon s3 sdk kullanarak bu çözmek ve nasıl nasıl, benim amazon s3 sanal yol sağlayıcıya geçiş ben bu kod yüzden şeyleri özetlemek için herhangi bir değişiklik olmadan doğrudan çalışmak istiyorum olmasıdır amazon s3 sanal yol sağlayıcımda Open (FileMode fileMode) yöntemimi uyguluyorum?

+0

[SDK] 'yı kullanmalısınız (http://aws.amazon.com/sdkfornet/). –

+0

@AaronMcIver Üzgünüm, sorum bulanıktı .. Daha fazla bilgi ekledim – Marcus

+1

Yapmam gerekecek şey, çeşitli bulut depolama sağlayıcısı SDK uygulamalarını barındıran bir arabirim/fabrika tasarımı yapmaktır. Patentlerinin herhangi birini ihlal etmediğinizi kontrol edin, örneğin [David Ebbo'nun Microsoft Patentleri] (http://www.google.com/patents/US20060206452) - ne yapmaya çalıştığınız oldukça güzel bir teknoloji geliştirme gibi geliyor! İyi şanslar!! –

cevap

1

Hey, ben de bu problem için durdum ve bunu bir akış uygulayarak çözdüm. (Dizi, ofset, sayım) yöntemleri yapıcısı ile

public static Stream OpenStream(S3TransferUtility transferUtility, string key) 
    {      
     byte[] buffer = new byte[Buffersize + Buffersize/2]; 

     S3CopyMemoryStream s3CopyStream = 
      new S3CopyMemoryStream(key, buffer, transferUtility) 
      .WithS3CopyFileStreamEvent(CreateMultiPartS3Blob); 

     return s3CopyStream; 
    } 

Benim Stream yakın geçersiz kılar ve yazmak ve akışı için amazon s3 kısmen karşıya:

Burada belki yardımcı olur yolumu i did it olduğunu.

public class S3CopyMemoryStream : MemoryStream 
    { 

     public S3CopyMemoryStream WithS3CopyFileStreamEvent(StartUploadS3CopyFileStreamEvent doing) 
     { 
      S3CopyMemoryStream s3CopyStream = new S3CopyMemoryStream(this._key, this._buffer, this._transferUtility); 

      s3CopyStream.StartUploadS3FileStreamEvent = new S3CopyMemoryStream.StartUploadS3CopyFileStreamEvent(CreateMultiPartS3Blob); 

      return s3CopyStream; 
     } 

     public S3CopyMemoryStream(string key, byte[] buffer, S3TransferUtility transferUtility) 
      : base(buffer) 
     { 
      if (buffer.LongLength > int.MaxValue) 
       throw new ArgumentException("The length of the buffer may not be longer than int.MaxValue", "buffer"); 

      InitiatingPart = true; 
      EndOfPart = false; 
      WriteCount = 1; 
      PartETagCollection = new List<PartETag>(); 

      _buffer = buffer; 
      _key = key; 
      _transferUtility = transferUtility; 
     } 

olay StartUploadS3FileStreamEvent

, uploadpart başlatmak ve yüklemeyi tamamlamak çağrı çağırır.

Alternatif size overriden FileStream yakın yöntemine

TransferUtilityUploadRequest request = 
      new TransferUtilityUploadRequest() 
      .WithAutoCloseStream(false).WithBucketName(
       transferUtility.BucketName) 
       .WithKey(key) 
       .WithPartSize(stream.PartSize) 
       .WithInputStream(stream) as TransferUtilityUploadRequest; 

     transferUtility.Upload(request); 

kullanabilirsiniz çünkü çok daha kolay bir FileStream uygulayabilir. Dezavantaj, tüm verileri önce diske yazmanız ve sonra yükleyebilmenizdir.

+0

Geç cevap için özür dilerim ama yakın ve yazma yöntemlerinin nasıl uygulanacağını merak ediyorum. Bir dosya yüklemeyi başardım ancak test dosyamın içeriği bozuk gibi görünüyor http://cl.ly/Lbcn – Marcus

+0

Ne yapmaya çalışıyorsunuz? sınıf: Memorystream veya sınıf: FileStream? Multipart API veya TransferUtility arayüzünü kullanarak? Yoksa eşzamansız yüklemeyi mi deniyorsunuz? Bir akış mı yoksa bir dosya yolu mu kullanıyorsunuz? Belki de başlangıcına kadar akışını aramak ve sonra yüklemek zorundasın? – zirbel

+1

Ben CreateMultiPartS3Blob googled ve sizin tarafından başka bir yazı http://stackoverflow.com/questions/13604916/s3-multi-part-upload-exception bulundu ve ben orada cevabı aldım, pozisyonu ayarlamak sorunu düzeltildi. Senden hemen hemen aynı uygulamayı kullanıyorum ve iyi çalışıyor. Kodunuzda sabit bir arabellek var gibi görünüyor ya da dosyanın boyutunu arabellek uzunluğu olarak kullanıyor musunuz? Yazma yönteminde bu konum satırına bakıyorum (Position> = Buffersize). – Marcus