Как написать строку в ведро Amazon S3?

Как добавить строку в файл на amazon s3? От whaterver, который я искал, я узнал, что мы можем загрузить файл на s3. Каков наилучший способ загрузки данных без создания файла?

Ответы

Ответ 1

Каков наилучший способ загрузки данных без создания файла?

Если вы имели в виду без создания файла на S3, вы не можете этого сделать. На Amazon S3 единственный способ хранения данных - это файлы или использование более точной терминологии, объектов. Объект может содержать от 1 байт нулевые байты до 5 терабайт данных и хранится в ведре. Amazon Домашняя страница S3 достаточно четко излагает основные факты. (Для других параметров хранения данных в AWS вы можете прочитать, например, SimpleDB.)

Если вы имели в виду без создания локального временного файла, тогда ответ зависит от того, какую библиотеку/инструмент вы используете. (Как предложил RickMeasham, пожалуйста, добавьте более подробную информацию!) Например, с помощью инструмента s3cmd вы не можете пропустить создание временного файла, в то время как библиотека Java JetS3t загружает строку напрямую было бы легко:

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

Ответ 2

Не выглядит так хорошо, но вот как вы можете это сделать, используя клиент Amazons Java, вероятно, что JetS3t делает за кулисами в любом случае.

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

Существует перегрузка для метода AmazonS3.putObject, который принимает строку bucket, ключевую строку и строку текстового содержимого. Я не видел упоминания об этом при переполнении стека, поэтому я помещаю это здесь. Это будет похоже на @Jonik ответ, но без дополнительной зависимости.

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

Ответ 4

Если вы используете java, проверьте 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);
    }
}

Ответ 5

Существует простой способ сделать это с PHP, просто отправьте строку как тело объекта, указав имя нового файла в ключе -

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

Это создаст новый файл в соответствии с указанным ключом, который имеет содержимое, указанное в строке.

Ответ 6

Я удивлен, что никто не имеет правильного ответа здесь.

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

Ответ 7

Это работает для меня:

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