2010-05-25 7 views
18

Quando si carica un file di immagine su un BLOB, l'immagine viene caricata apparentemente correttamente (nessun errore). Quando vado su cloud storage studio, il file è lì, ma con una dimensione di 0 (zero) byte.Archiviazione di Azure: file caricati con dimensione zero byte

Il seguente è il codice che sto usando:

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

Prima che il file immagine viene caricato per la memorizzazione, l'InputStream Proprietà dal HttpPostedFileBase sembra essere fine (la dimensione della dell'immagine corrisponde a cosa è previsto! E nessuna eccezione viene lanciata).

E la cosa davvero strana è che questo funziona perfettamente in altri casi (caricando Power Point o anche altre immagini dal ruolo di lavoratore). Il codice che chiama il metodo SetContent sembra essere esattamente lo stesso e il file sembra essere corretto poiché viene creato un nuovo file con zero byte nella posizione corretta.

Qualcuno ha qualche suggerimento per favore? Ho eseguito il debug di questo codice dozzine di volte e non riesco a vedere il problema. Qualsiasi suggerimento è benvenuto!

Grazie

risposta

43

La proprietà Posizione del InputStream del HttpPostedFileBase avevano lo stesso valore della proprietà Length (probabilmente perché ho avuto un altro file precedente a questo -! Stupido credo).

Tutto quello che dovevo fare era impostare la proprietà Posizione su 0 (zero)!

Spero che questo aiuti qualcuno in futuro.

+6

Per chiarire un po ', quando si lavora con un flusso, verificare che si imposta proprietà Posizione del torrente a 0 dopo aver caricato qualunque byte in esso. Per impostazione predefinita, la posizione di un flusso verrà impostata alla fine del suo contenuto per qualche motivo. – Dusda

+0

Sì, è qualcosa che sono sempre consapevole adesso e non mi lascio mai più di un secondo per ricordarlo. Grazie! –

+0

Sì, grazie :) –

15

Grazie Fabio per aver portato questo e aver risolto la tua stessa domanda. Voglio solo aggiungere del codice a qualsiasi cosa tu abbia detto. Il tuo suggerimento ha funzionato perfettamente per me.

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

E ora sei pronto per caricare MemoryStream utilizzando:

blockBlob.UploadFromStream(memoryStream);