2012-11-19 6 views
5

का उपयोग कर फ़ाइल अपलोड करें इस प्रश्न की पृष्ठभूमि वर्चुअल फ़ाइल सिस्टम पर आधारित है जो मैं विकसित कर रहा हूं। मैं जिस अवधारणा का उपयोग कर रहा हूं वह विभिन्न प्रकार के स्टोरेज प्रकार i.e स्थानीय फ़ाइल सिस्टम, ड्रॉपबॉक्स और अमेज़ॅन एस 3 के लिए वायरलल पथ प्रदाता है। वर्चुअल फ़ाइल के लिए मेरा बेस क्लास इस तरह दिखता है:वर्चुअल पथ प्रदाता और अमेज़ॅन एस 3 एसडीके

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) { } 
} 

दूसरी ओपन विधि का कार्यान्वयन मेरा प्रश्न है। अगर हम स्थानीय फाइल सिस्टम के लिए मेरे कार्यान्वयन पर देखने के डिस्क पर एक फ़ाइल को सहेजने यानी यह इस तरह दिखता है:

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

इस कुछ इस तरह दिखेगा मैं स्थानीय फाइल सिस्टम पर एक फ़ाइल को बचाने के लिए करना चाहते हैं:

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); 
    } 

क्या मैं चाहता हूँ कि अगर मैं अपने अमेज़न S3 आभासी पथ प्रदाता पर स्विच मैं इस कोड बिना किसी परिवर्तन के सीधे काम करने के लिए इसलिए चीजों को योग करने के लिए चाहता हूँ, मैं कैसे इस अमेज़न S3 SDK का उपयोग करने को सुलझाने और कैसे कर सकते हैं चाहिए मैं अपने अमेज़ॅन एस 3 आभासी पथ प्रदाता में अपना ओपन (फ़ाइलमोड फ़ाइल मोड) विधि लागू करता हूं?

+0

आपको [एसडीके] (http://aws.amazon.com/sdkfornet/) का उपयोग करना चाहिए। –

+0

@AaronMcIver क्षमा करें, मेरा प्रश्न अस्पष्ट था .. मैंने और जानकारी – Marcus

+1

जोड़ दी है, मुझे लगता है कि आपको क्या करने की आवश्यकता होगी एक इंटरफेस/फैक्ट्री डिज़ाइन है जो विभिन्न क्लाउड स्टोरेज प्रदाता एसडीके कार्यान्वयन को समायोजित करता है। जांचें कि आप अपने किसी भी पेटेंट का उल्लंघन नहीं कर रहे हैं, उदाहरण के लिए [डेविड एब्बो के माइक्रोसॉफ्ट पेटेंट] (http://www.google.com/patents/US20060206452) - क्या आप एक बहुत अच्छा प्रौद्योगिकी विकास की तरह आवाज करने की कोशिश कर रहे हैं! सौभाग्य!! –

उत्तर

1

अरे मैं इस समस्या के लिए भी खड़ा था, और मैंने इसे एक धारा लागू करने का हल किया।

यहाँ मेरे रास्ते मैं यह किया है शायद यह मदद करता है:

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; 
    } 

मेरे निर्माता के साथ स्ट्रीम पास ओवरराइड करता है और लिखने (सरणी, ऑफसेट, गिनती) तरीकों और धारा में अमेज़न S3 आंशिक रूप से अपलोड करें।

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; 
     } 

घटना StartUploadS3FileStreamEvent एक फोन है कि आरंभ किया है, uploadpart और अपलोड पूर्ण invokes।

वैकल्पिक रूप से आप एक FileStream जो बहुत आसान है क्योंकि आप ओवरराइड FileStream के पास विधि पर

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

     transferUtility.Upload(request); 

उपयोग कर सकते हैं लागू कर सकता है। नुकसान यह है कि आपको डिस्क पर पूरा डेटा पहले लिखना होगा और फिर आप इसे अपलोड कर सकते हैं।

+0

देर से प्रतिक्रिया के लिए खेद है, लेकिन मैं इस बारे में उत्सुक हूं कि करीबी और लिखने के तरीकों का कार्यान्वयन कैसा दिखता है। मैंने एक फाइल अपलोड करने में कामयाब रहा है लेकिन मेरी टेस्ट फाइल की सामग्री दूषित है http://cl.ly/Lbcn – Marcus

+0

आप क्या करने का प्रयास करते हैं? कक्षा: मेमोरीस्ट्रीम या कक्षा: फाइलस्ट्रीम? मल्टीपार्ट एपीआई या ट्रांसफर यूटिलिटी इंटरफ़ेस का उपयोग करना? या आप एसिंक्रोनली अपलोड करने का प्रयास करते हैं? क्या आप स्ट्रीम या फ़ाइलपैथ का उपयोग करते हैं? हो सकता है कि आपको शुरुआत तक स्ट्रीम की तलाश करनी पड़े और फिर अपलोड करें? – zirbel

+1

मैंने CreateMultiPartS3Blob को गुगल किया और आपके द्वारा एक और पोस्ट http://stackoverflow.com/questions/13604916/s3-multi-part-upload-exception मिला और मुझे जवाब मिला, 0 को मेरी समस्या को ठीक करने के लिए स्थिति सेट कर दिया। मैं आपकी पोस्ट में लगभग उसी कार्यान्वयन का उपयोग करता हूं और यह ठीक काम करता है। ऐसा लगता है कि आपके पास अपने कोड में एक निश्चित बफर है या आप फ़ाइल के आकार को बफर लंबाई के रूप में उपयोग करते हैं? यदि कोड लिखने में (स्थिति> = बफरसाइज) कोड की इस पंक्ति का संदर्भ लें। – Marcus