2016-04-19 4 views
0

Ich teste, wie Sie mit SDK mit einer Beispiel-TXT-Datei aus einer Webanwendung nach AWS hochladen. Die Datei wird in den Bucket hochgeladen, aber die heruntergeladene Datei aus dem Bucket ist nur ein leeres Notepad-Dokument ohne den Text der ursprünglichen hochgeladenen Datei. Ich bin neu mit Streams arbeiten, also bin ich mir nicht sicher, was hier falsch sein könnte. Kann jemand sehen, warum die Daten in der Übertragungsanfrage nicht gesendet wurden? Danke im Voraus!HttpPostedFileBase Stream-Upload zu AWS SDK-Bucket hat keine Daten

using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USWest1)) 
{ 
    //Save File to Bucket 
    using (FileStream txtFileStream = (FileStream)UploadedHttpFileBase.InputStream) 
    { 
     try 
     { 
      TransferUtility fileTransferUtility = new TransferUtility(); 
      fileTransferUtility.Upload(txtFileStream, bucketLocation, 
       UploadedHttpFileBase.FileName); 
     } 
     catch (Exception e) 
     { 
      e.Message.ToString(); 
     } 
    } 
} 

EDIT:

Sowohl TransferUtility und PutObjectRequest/PutObjectResponse/AmazonS3Client.PutObject gespeichert eine leere Textdatei. Nachdem einige Probleme bei der Instantiierung eines neuen FileStream aufgetreten sind, speicherte ein MemoryStream, der nach dem Zurücksetzen der Startposition auf Null verwendet wurde, eine leere Textdatei. Irgendwelche Ideen?

Neuer Code:

using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USWest1)) 
{ 
    Stream saveableStream = new MemoryStream(); 
    using (Stream source = (Stream)UploadedHttpFileBase.InputStream) 
    { 
     source.Position = 0; 
     source.CopyTo(saveableStream); 
    } 

    //Save File to Bucket           
    try 
    { 
     PutObjectRequest request = new PutObjectRequest 
     { 
      BucketName = bucketLocation, 
      Key = UploadedHttpFileBase.FileName, 
      InputStream = saveableStream 
     }; 
     PutObjectResponse response = client.PutObject(request); 
    } 
    catch (Exception e) 
    { 
     e.Message.ToString(); 
    } 
} 

Antwort

0

Die Antwort hatte etwas mit Verschachtelung zu tun, was immer noch ein wenig jenseits meines Verständnisses ist, und nicht, weil der Code, der hier gepostet wurde, von Natur aus falsch war. Dieser Code kam nach einem initialen StreamReader, der die erste Zeile der Textdatei überprüfte, um festzustellen, ob die Datei gespeichert werden soll oder nicht. Nach dem Verschieben des Codes aus der while-Schleife mit den ReadLines funktionierte der Upload. Alles funktioniert so, wie es jetzt sein soll, dass die Validierung reorganisiert wird, so dass der verschachtelte Stream oder MemoryStream nicht benötigt wird.

0

meisten wahrscheinlich, dass TransferUtility nicht gut funktioniert mit temporären Dateien hochladen. Versuchen Sie, Ihren Eingabe-Stream irgendwo zu kopieren (z. B. in eine andere, nicht so temporäre Datei oder sogar MemoryStream, wenn Sie sicher sind, würde es Ihnen OutOfMemory irgendwann nicht geben). Eine andere Sache ist, TransferUtility loszuwerden und Low-Level-AmazonS3Client.PutObject zu verwenden, mit dem Sie die Lebensdauer des Streams besser kontrollieren können (vergessen Sie nicht, dass Sie einige Wiederholungsversuche implementieren müssen, da S3-API zufällige temporäre Fehler zurückgibt).

+0

Danke für die Antwort, Andrey. Ich habe sowohl TransferUtility als auch PutObjectRequest/PutObjectResponse/AmazonS3Client.PutObject verwendet und beide haben eine leere Textdatei gespeichert. Wie würde man den Eingabestream in eine nicht temporäre Datei kopieren, ohne MemoryStream zu verwenden? – jle

+0

Ich habe MemoryStream verwendet und die Startposition auf Null zurückgesetzt, nur für den Fall, aber eine leere Datei wird immer noch gespeichert. Irgendwelche Ideen? – jle