2011-06-25 29 views
5

¿Cómo puedo guardar un objeto de mapa de bits como una imagen en Amazon S3?Agregar un archivo a un depósito en Amazon S3 usando C#

Tengo todo configurado pero mi C sharp limitado me impide hacer esto.

// I have a bitmap iamge 
Bitmap image = new Bitmap(width, height); 

// Rather than this 
image.save(file_path); 

// I'd like to use S3 
S3 test = new S3(); 
test.WritingAnObject("images", "testing2.png", image); 

// Here is the relevant part of write to S3 function 
PutObjectRequest titledRequest = new PutObjectRequest(); 
titledRequest.WithMetaData("title", "the title") 
      .WithContentBody("this object has a title") 
      .WithBucketName(bucketName) 
      .WithKey(keyName); 

Como se puede ver la función S3 sólo puede tener en una cadena y guardarlo como el cuerpo del archivo.

¿Cómo puedo escribir esto de tal manera que me permita pasar un objeto de mapa de bits y guardarlo como una imagen? Tal vez como una corriente? ¿O como una matriz de bytes?

Agradezco cualquier ayuda.

+0

Ummm ... ¿guardar su imagen en un archivo, convertir el archivo en una cadena hexadecimal y pasar esa cadena? No sé nada sobre s3, pero creo que esto puede ayudar. – Vercas

+0

No quiero la sobrecarga de guardar primero la imagen en un archivo. Estoy seguro de que se puede hacer mientras la imagen aún está en la memoria. – Abs

+0

Luego guárdelo en una secuencia de memoria. – Vercas

Respuesta

11

Se podría utilizar WithInputStream o WithFilePath. Por ejemplo, al guardar una nueva imagen en S3:

using (var memoryStream = new MemoryStream()) 
{ 
    using(var yourBitmap = new Bitmap()) 
    { 
     //Do whatever with bitmap here. 
     yourBitmap.Save(memoryStream, ImageFormat.Jpeg); //Save it as a JPEG to memory stream. Change the ImageFormat if you want to save it as something else, such as PNG. 
     PutObjectRequest titledRequest = new PutObjectRequest(); 
     titledRequest.WithMetaData("title", "the title") 
      .WithInputStream(memoryStream) //Add file here. 
      .WithBucketName(bucketName) 
      .WithKey(keyName); 
    } 
} 
+0

Ok, esto tiene sentido, ¿cómo convertiría un objeto Bitmap en una secuencia de memoria? Disculpe si esta es una pregunta simple pero soy un novato cuando se trata de C#. – Abs

+1

@Abs: actualicé el ejemplo de código para incluir un ejemplo de guardar un mapa de bits en un MemoryStream. – vcsjones

+0

Funcionó. Pero tuve que poner la llamada a '.WithInputStream (memoryStream)' después de 'WithKey (keyName)'. Ahora solo tengo que resolver un no puedo acceder a un flujo cerrado cuando intento hacer esto: 'using (S3Response responseWithMetadata = client.PutObject (titledRequest)) - ¿Alguna idea? – Abs

2

Conjunto InputStream la propiedad de su solicitud objeto:

titledRequest.InputStream = image; 
Cuestiones relacionadas