2010-05-25 5 views
18

Wenn ich eine Image-Datei in einen Blob hochlade, wird das Image scheinbar erfolgreich hochgeladen (keine Fehler). Wenn ich in Cloud Storage Studio gehe, ist die Datei dort, aber mit einer Größe von 0 (null) Bytes.Azure-Speicher: Hochgeladene Dateien mit der Größe Null Bytes

Im Folgenden ist der Code, den ich verwende:

// These two methods belong to the ContentService class used to upload 
// files in the storage. 
public void SetContent(HttpPostedFileBase file, string filename, bool overwrite) 
{ 
    CloudBlobContainer blobContainer = GetContainer(); 
    var blob = blobContainer.GetBlobReference(filename); 

    if (file != null) 
    { 
     blob.Properties.ContentType = file.ContentType; 
     blob.UploadFromStream(file.InputStream); 
    } 
    else 
    { 
     blob.Properties.ContentType = "application/octet-stream"; 
     blob.UploadByteArray(new byte[1]); 
    } 
} 

public string UploadFile(HttpPostedFileBase file, string uploadPath) 
{ 
    if (file.ContentLength == 0) 
    { 
     return null; 
    } 

    string filename; 
    int indexBar = file.FileName.LastIndexOf('\\'); 
    if (indexBar > -1) 
    { 
     filename = DateTime.UtcNow.Ticks + file.FileName.Substring(indexBar + 1); 
    } 
    else 
    { 
     filename = DateTime.UtcNow.Ticks + file.FileName; 
    } 
    ContentService.Instance.SetContent(file, Helper.CombinePath(uploadPath, filename), true); 
    return filename; 
} 

// The above code is called by this code. 
HttpPostedFileBase newFile = Request.Files["newFile"] as HttpPostedFileBase; 
ContentService service = new ContentService(); 
blog.Image = service.UploadFile(newFile, string.Format("{0}{1}", Constants.Paths.BlogImages, blog.RowKey)); 

Bevor die Image-Datei auf den Speicher hochgeladen wird, wird die Input vom HttpPostedFileBase erscheinen in Ordnung zu sein (die Größe des Bildes entspricht was erwartet wird und keine Ausnahmen werden geworfen).

Und das wirklich seltsame ist, dass dies in anderen Fällen perfekt funktioniert (Hochladen von Power Points oder anderen Bildern aus der Worker-Rolle). Der Code, der die SetContent-Methode aufruft, scheint genau gleich zu sein, und die Datei scheint korrekt zu sein, da eine neue Datei mit null Byte an der richtigen Stelle erstellt wird.

Hat jemand bitte einen Vorschlag? Ich debuggte diesen Code Dutzende Male und ich kann das Problem nicht sehen. Irgendwelche Vorschläge sind willkommen!

Dank

Antwort

43

Die Eigenschaft Position des Input des HttpPostedFileBase hatte den gleichen Wert wie die Eigenschaft Länge (wahrscheinlich, weil ich vor dieser eine andere Datei hatte - dumm glaube ich).

Alles, was ich tun musste, war, die Eigenschaft Position wieder auf 0 (Null) zu setzen!

Ich hoffe, das hilft jemandem in der Zukunft.

+6

leicht Um zu klären, wenn Sie mit einem Strom arbeiten, überprüfen Sie, ob Sie den Stream der Eigenschaft Position auf 0 gesetzt, nachdem Sie laden was auch immer für Bytes. Standardmäßig wird die Position eines Streams aus irgendeinem Grund an das Ende seines Inhalts gesetzt. – Dusda

+0

Ja, das ist mir immer bewusst, und ich verliere nie mehr als eine Sekunde, um mich daran zu erinnern. Vielen Dank! –

+0

Es tat, danke :) –

15

Danke Fabio für die Lösung und die Lösung Ihrer eigenen Frage. Ich möchte nur Code hinzufügen, was immer du gesagt hast. Ihr Vorschlag hat perfekt für mich funktioniert.

 var memoryStream = new MemoryStream(); 

     // "upload" is the object returned by fine uploader 
     upload.InputStream.CopyTo(memoryStream); 
     memoryStream.ToArray(); 

// After copying the contents to stream, initialize it's position 
// back to zeroth location 

     memoryStream.Seek(0, SeekOrigin.Begin); 

Und jetzt sind Sie bereit, Memorystream hochladen mit:

blockBlob.UploadFromStream(memoryStream);