web-dev-qa-db-fra.com

Comment écrire une chaîne dans le compartiment Amazon S3?

Comment puis-je ajouter une chaîne en tant que fichier sur Amazon s3? De tout ce que j'ai recherché, j'ai appris que nous pouvons télécharger un fichier sur s3. Quelle est la meilleure façon de télécharger des données sans créer de fichier?

27
Sourabh

Quelle est la meilleure façon de télécharger des données sans créer de fichier?

Si vous vouliez dire sans créer de fichier sur S3, eh bien, vous ne pouvez pas vraiment le faire. Sur Amazon S3, la seule façon de stocker des données est sous forme de fichiers, ou en utilisant une terminologie plus précise, des objets . Un objet peut contenir de 1 octet zéro octet à 5 téraoctets de données, et est stocké dans un compartiment . Amazon's la page d'accueil S3 expose très clairement les faits de base . (Pour d'autres options de stockage de données sur AWS, vous voudrez peut-être lire, par exemple, à propos de SimpleDB .)

Si vous vouliez dire sans créer de fichier temporaire local, la réponse dépend de la bibliothèque/de l'outil que vous utilisez. (Comme RickMeasham l'a suggéré, veuillez ajouter plus de détails!) Avec l'outil s3cmd, par exemple, vous ne pouvez pas ignorer la création d'un fichier temporaire, tandis qu'avec la bibliothèque JetS3t Java téléchargement d'une chaîne directement serait facile :

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

Ne semble pas aussi agréable, mais voici comment vous pouvez le faire en utilisant Amazons Java, probablement ce que JetS3t fait en coulisses de toute façon.

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;
        }
    }
11
Paul Taylor

Il y a surcharge pour la méthode AmazonS3.putObject qui accepte la chaîne de compartiment, une chaîne de clé et une chaîne de contenu texte. Je ne l'avais pas vu mentionner sur le débordement de pile, donc je mets cela ici. Ça va être la réponse de @ Jonik similaire, mais sans la dépendance supplémentaire.

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

Il existe un moyen simple de le faire avec PHP, envoyez simplement la chaîne comme corps de l'objet, en spécifiant le nom du nouveau fichier dans la clé -

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

Cela créera un nouveau fichier selon la clé spécifiée, qui a un contenu tel que spécifié dans la chaîne.

6
Rony

Si vous utilisez Java, consultez 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);
    }
}
3
Ivan

Cela fonctionne pour moi:

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);
}
0
MikeM