2010-03-23 20 views
15

¿Cómo puedo agregar una cadena como un archivo en amazon s3? De lo que busqué, llegué a saber que podemos subir un archivo a s3. ¿Cuál es la mejor manera de subir datos sin crear un archivo?¿Cómo escribir una cadena en el cubo de Amazon S3?

+1

Le sugiero que obtenga más ayuda si su pregunta tiene más detalles. Como en qué idioma está escribiendo y qué biblioteca, si hay alguna, está utilizando para interactuar con S3. – RickMeasham

Respuesta

3

¿Cuál es la mejor manera de cargar datos sin crear un archivo?

Si quieres decir sin crear un archivo en S3, bueno, realmente no puedes hacer eso. En Amazon S3, el único forma de almacenar datos es como archivos, o utilizando una terminología más precisa, objetos. Un objeto puede contener desde 1 byte cero bytes hasta 5 terabytes de datos, y se almacena en un contenedor . Amazon's S3 homepage lays out the basic facts quite clearly. (Para otras opciones de almacenamiento de datos en AWS, es posible que desee leer, por ejemplo, sobre SimpleDB.)

Si quiere decir sin crear un archivo temporal local, la respuesta depende de qué biblioteca/herramienta está utilizando. (Como se sugiere RickMeasham, por favor añadir más detalles!) Con la herramienta s3cmd, por ejemplo, no se puede omitir la creación de archivos temporales, mientras que con la biblioteca de Java JetS3t la posibilidad de subir directamente una cadena would be easy:

// (First init s3Service and testBucket) 
S3Object stringObject = new S3Object("HelloWorld.txt", "Hello World!"); 
s3Service.putObject(testBucket, stringObject); 
+1

Un objeto en S3 también puede tener un tamaño de cero bytes, no el mínimo que sugiera. :) – chilts

+13

Cómo se hace esto con la API de Amazonas, su versión de S3Object no tiene dicho constructor –

10

NO se ve tan bien, pero así es cómo puedes hacerlo usando Amazons Java Client, probablemente lo que JetS3t hace detrás de las escenas de todos modos.

private boolean putArtistPage(AmazonS3 s3,String bucketName, String key, String webpage) 
    { 
     try 
     { 
      byte[]     contentAsBytes = webpage.getBytes("UTF-8"); 
      ByteArrayInputStream contentsAsStream  = new ByteArrayInputStream(contentAsBytes); 
      ObjectMetadata   md = new ObjectMetadata(); 
      md.setContentLength(contentAsBytes.length); 
      s3.putObject(new PutObjectRequest(bucketname, key, contentsAsStream, md)); 
      return true; 
     } 
     catch(AmazonServiceException e) 
     { 
      log.log(Level.SEVERE, e.getMessage(), e); 
      return false; 
     } 
     catch(Exception ex) 
     { 
      log.log(Level.SEVERE, ex.getMessage(), ex); 
      return false; 
     } 
    } 
3

Si está utilizando Java, echa un vistazo a https://ivan-site.com/2015/11/interact-with-s3-without-temp-files/

import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3Client; 
import com.amazonaws.services.s3.model.GetObjectRequest; 
import com.amazonaws.services.s3.model.ObjectMetadata; 
import com.amazonaws.services.s3.model.PutObjectRequest; 
import com.amazonaws.services.s3.model.S3Object; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 

import java.io.*; 
import java.nio.charset.StandardCharsets; 

class S3StreamJacksonTest { 
    private static final String S3_BUCKET_NAME = "bucket"; 
    private static final String S3_KEY_NAME = "key"; 
    private static final String CONTENT_TYPE = "application/json"; 

    private static final AmazonS3 AMAZON_S3 = new AmazonS3Client(); 
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); 
    private static final TestObject TEST_OBJECT = new TestObject("test", 123, 456L); 

    public void testUploadWithStream() throws JsonProcessingException { 
     String fileContentString = OBJECT_MAPPER.writeValueAsString(TEST_OBJECT); 
     byte[] fileContentBytes = fileContentString.getBytes(StandardCharsets.UTF_8); 
     InputStream fileInputStream = new ByteArrayInputStream(fileContentBytes); 
     ObjectMetadata metadata = new ObjectMetadata(); 
     metadata.setContentType(CONTENT_TYPE); 
     metadata.setContentLength(fileContentBytes.length); 
     PutObjectRequest putObjectRequest = new PutObjectRequest(
       S3_BUCKET_NAME, S3_KEY_NAME, fileInputStream, metadata); 
     AMAZON_S3.putObject(putObjectRequest); 
    } 
} 
0

Esto funciona para mí:

public static PutObjectResult WriteString(String bucket, String key, String stringToWrite, AmazonS3Client s3Client) { 
    ObjectMetadata meta = new ObjectMetadata(); 
    meta.setContentMD5(new String(com.amazonaws.util.Base64.encode(DigestUtils.md5(stringToWrite)))); 
    meta.setContentLength(stringToWrite.length()); 
    InputStream stream = new ByteArrayInputStream(stringToWrite.getBytes(StandardCharsets.UTF_8)); 
    return s3Client.putObject(bucket, key, stream, meta); 
} 
5

Hay un overload for the AmazonS3.putObject method que acepte la cadena de cubo, una cadena de clave, y una cadena de contenido de texto. No lo había visto en el desbordamiento de la pila, así que lo estoy poniendo aquí. Va a ser similar a la respuesta de Jonik, pero sin la dependencia adicional.

AmazonS3 s3client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build(); 
s3client.putObject(bucket, key, contents); 
2

Hay una forma sencilla de hacerlo con PHP, basta con enviar la cadena como el cuerpo del objeto, especificando el nombre del archivo nuevo en la tecla -

$s3->putObject(array(
     'Bucket'  => [Bucket name], 
     'Key'   => [path/to/file.ext], 
     'Body'   => [Your string goes here], 
     'ContentType' => [specify mimetype if you want], 
    )); 

Esto creará un nuevo archivo de acuerdo con la clave especificada, que tiene un contenido como se especifica en la cadena.

1

Me sorprende que nadie tenga la respuesta correcta aquí. Ver official documentation aquí para Java API.

s3Client.putObject(new PutObjectRequest(S3_BUCKET_NAME, fileName, rawString)); 

Para más lenguajes de programación, por favor verifica here.

+0

¿No es [redirectLocation] (https: //docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/PutObjectRequest.html # PutObjectRequest-java.lang.String-java.lang.String-java.lang.String-)? – Valentin

+0

De acuerdo con [documentos] (https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html). Asi es como se hace. –

+0

Este documento se trata de cargar archivos, no hay nada sobre la carga de contenido como una cadena. La solución más simple y correcta está aquí - https://stackoverflow.com/a/42510981/7374267 – Valentin

Cuestiones relacionadas