2010-05-25 6 views
18

Lorsque je télécharge un fichier image sur un blob, l'image est téléchargée avec succès (sans erreur). Quand je vais au studio de stockage en nuage, le fichier est là, mais avec une taille de 0 (zéro) octet.Stockage Azure: fichiers téléchargés avec des octets de taille zéro

Voici le code que j'utilise:

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

Avant le fichier image est téléchargé sur le stockage, la InputStream propriété du HttpPostedFileBase semble être bien (la taille de la de l'image correspond à ce qui est attendu! Et aucune exception n'est levée).

Et la chose vraiment étrange est que cela fonctionne parfaitement dans d'autres cas (téléchargement de Power Points ou même d'autres images du rôle de travailleur). Le code qui appelle la méthode SetContent semble être exactement le même et le fichier semble être correct car un nouveau fichier avec zéro octets est créé à l'emplacement correct.

Quelqu'un a-t-il des suggestions s'il vous plaît? J'ai débogué ce code des dizaines de fois et je ne vois pas le problème. Toutes les suggestions sont les bienvenues!

Merci

Répondre

43

La propriété Position du InputStream du HttpPostedFileBase avaient la même valeur que la propriété Longueur (probablement parce que j'avais un autre fichier précédent à celui-ci - stupide je pense).

Tout ce que je devais faire était de remettre la propriété Position à 0 (zéro)! J'espère que cela aidera quelqu'un dans le futur.

+6

Pour clarifier un peu, lorsque vous travaillez avec un flux, assurez-vous que vous définissez la propriété Position du flux à 0 après le chargement quels que soient les octets qu'il contient. Par défaut, la position d'un flux sera définie à la fin de son contenu pour une raison quelconque. – Dusda

+0

Oui, c'est quelque chose que je suis toujours conscient maintenant et je ne perds jamais plus d'une seconde pour m'en souvenir. Merci! –

+0

Il l'a fait, merci :) –

15

Merci à Fabio d'avoir soulevé cette question et d'avoir résolu votre propre question. Je veux juste ajouter du code à tout ce que vous avez dit. Votre suggestion a parfaitement fonctionné pour moi.

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

Et maintenant, vous êtes prêt à télécharger MemoryStream en utilisant:

blockBlob.UploadFromStream(memoryStream); 
Questions connexes