web-dev-qa-db-ja.com

Amazon S3バケットに文字列を書き込む方法は?

Amazon s3で文字列をファイルとして追加するにはどうすればよいですか?何を検索しても、ファイルをs3にアップロードできることがわかりました。ファイルを作成せずにデータをアップロードする最良の方法は何ですか?

27
Sourabh

ファイルを作成せずにデータをアップロードする最良の方法は何ですか?

S3でファイルを作成せずに意図した場合、まあ、それを実際に行うことはできません。 Amazon S3では、データを保存するonly方法はファイルとして、またはより正確な用語を使用して、objects。オブジェクトには、 1バイト 0バイトから5テラバイトのデータで、バケットに格納されます。 Amazonの S3ホームページは基本的な事実を非常に明確にレイアウトしています 。 (AWSの他のデータ保存オプションについては、たとえば、約 SimpleDB を参照することをお勧めします。)

ローカルの一時ファイルを作成せずに意図した場合、答えは使用しているライブラリ/ツールによって異なります。 (RickMeashamが提案したように、詳細を追加してください!)たとえば、s3cmdツールでは、一時ファイルの作成をスキップできませんが、JetS3tではJavaライブラリが文字列を直接アップロードします 簡単でしょう

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

見栄えが良くありませんが、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;
        }
    }
11
Paul Taylor

バケット文字列、キー文字列、およびテキストコンテンツの文字列を受け入れる AmazonS3.putObjectメソッドのオーバーロード があります。スタックオーバーフローでの言及は見たことがなかったので、ここに配置します。 @Jonikの回答と似ていますが、追加の依存関係はありません。

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

PHPでそれを行う簡単な方法があります、キーに新しいファイルの名前を指定して、オブジェクトの本体として文字列を送信するだけです-

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

これにより、文字列で指定された内容を持つ、指定されたキーに従って新しいファイルが作成されます。

6
Rony

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

これは私にとってはうまくいきます:

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