file-upload - descargar - portal azure
Almacenamiento de Azure: archivos cargados con tamaƱo cero bytes (2)
Gracias Fabio por hablar de esto y resolver tu propia pregunta. Solo quiero añadir código a lo que has 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 estás listo para cargar memoryStream usando:
blockBlob.UploadFromStream(memoryStream);
Cuando subo un archivo de imagen a un blob, la imagen se carga aparentemente 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.
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 cargue en el almacenamiento, la propiedad InputStream de HttpPostedFileBase parece estar bien (el tamaño de la imagen corresponde a lo que se espera. No se producen excepciones).
Y lo realmente extraño es que esto funciona perfectamente en otros casos (cargar Power Points o incluso otras imágenes del rol de Trabajador). El código que llama al método SetContent parece ser exactamente el mismo y el archivo parece 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
La propiedad Position del InputStream de HttpPostedFileBase tenía el mismo valor que la propiedad Length (probablemente porque tenía otro archivo anterior a este, ¡creo que estúpido!).
Todo lo que tenía que hacer era restablecer la propiedad Position a 0 (cero).
Espero que esto ayude a alguien en el futuro.