Как написать строку в ведро Amazon S3? - PullRequest
23 голосов
/ 23 марта 2010

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

Ответы [ 6 ]

11 голосов
/ 28 февраля 2017

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

AmazonS3 s3client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
s3client.putObject(bucket, key, contents);
11 голосов
/ 24 апреля 2015

Выглядит не так хорошо, но вот как вы можете это сделать с помощью Java-клиента Amazons, вероятно, в любом случае 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;
        }
    }
6 голосов
/ 03 мая 2010

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

Если вы имели в виду, не создавая файл на S3, вы не сможете этого сделать. В Amazon S3 способ хранения данных only - это файлы или, если использовать более точную терминологию, objects . Объект может содержать от 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);
5 голосов
/ 28 июля 2017

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

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

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

3 голосов
/ 20 октября 2016

Если вы используете Java, ознакомьтесь с https://ivan -site.com / 2015/11 / взаимодействовать с s3-без-временных файлов /

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 голосов
/ 13 января 2017

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...