2010-05-25 27 views
18

Cuando cargo un archivo de imagen en un blob, la imagen se carga al parecer con éxito (sin errores). Cuando voy al estudio de almacenamiento en la nube, el archivo está allí, pero con un tamaño de 0 (cero) bytes.Almacenamiento en Azure: archivos cargados con tamaño cero bytes

El siguiente es el código que estoy 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)); 

Antes de que el archivo de imagen se carga en el almacenamiento, el InputStream propiedad de la HttpPostedFileBase parece estar bien (el tamaño de la de la imagen corresponde a lo que se espera! Y no se arrojan excepciones).

Y lo realmente extraño es que esto funciona perfectamente en otros casos (cargar Power Points o incluso otras imágenes de la función Worker). El código que llama al método SetContent parece ser exactamente el mismo y el archivo parece ser correcto ya que se crea un nuevo archivo con cero bytes en la ubicación correcta.

¿Alguien tiene alguna sugerencia, por favor? Depuré este código docenas de veces y no puedo ver el problema. Cualquier sugerencia es bienvenida!

Gracias

Respuesta

43

La propiedad Posición del InputStream del HttpPostedFileBase tenían el mismo valor que la propiedad Longitud (probablemente porque no tenía otro archivo anterior a éste - estúpida creo).

¡Todo lo que tenía que hacer era restablecer la propiedad Posición a 0 (cero)!

Espero que esto ayude a alguien en el futuro.

+6

Para aclarar un poco, cuando se está trabajando con una corriente, comprobar para asegurarse de que se establece la propiedad Posición de la corriente a 0 después de cargar cualesquiera bytes en él. Por defecto, la Posición de una Secuencia se establecerá al final de su contenido por algún motivo. – Dusda

+0

Sí, eso es algo de lo que estoy siempre enterado y nunca pierdo más de un segundo para recordarlo. ¡Gracias! –

+0

Lo hizo, gracias :) –

15

Gracias Fabio por plantear esto y resolver su propia pregunta. Solo quiero agregar código a lo que sea que hayas dicho. Tu sugerencia funcionó perfectamente para mí.

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

Y ahora usted está listo para subir MemoryStream usando:

blockBlob.UploadFromStream(memoryStream); 
Cuestiones relacionadas