【问题标题】:How to write a string to Amazon S3 bucket?如何将字符串写入 Amazon S3 存储桶?
【发布时间】:2011-01-30 17:53:01
【问题描述】:

如何在 amazon s3 上添加字符串作为文件?从我搜索的whaterver中,我知道我们可以将文件上传到s3。在不创建文件的情况下上传数据的最佳方式是什么?

【问题讨论】:

标签: amazon-s3 amazon-web-services


【解决方案1】:

有一个overload for the AmazonS3.putObject method 接受桶字符串、一个密钥字符串和一个文本内容字符串。我没有看到堆栈溢出时提到它,所以我把它放在这里。这将类似于@Jonik 的答案,但没有额外的依赖。

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

【讨论】:

    【解决方案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】:

      上传数据的最佳方式是什么 不创建文件?

      如果您的意思是不在 S3 上创建文件,那么您真的不能这样做。在 Amazon S3 上,唯一 存储数据的方式是作为文件,或者使用更准确的术语,对象。一个对象可以包含从 1 字节 零字节到 5 TB 的数据,并存储在 bucket 中。亚马逊的S3 homepage lays out the basic facts quite clearly。 (对于 AWS 上的其他数据存储选项,您可能需要阅读例如关于 SimpleDB。)

      如果您的意思是不创建本地临时文件,那么答案取决于您使用的库/工具。 (正如 RickMeasham 建议的那样,请添加更多详细信息!)例如,使用 s3cmd 工具,您不能跳过创建临时文件,而使用 JetS3t Java 库直接上传字符串would be easy

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

      【讨论】:

      • S3 中的对象也可以是零字节大小,而不是您建议的最小字节。 :)
      • 你如何使用 Amazons API 做到这一点,那里的 S3Object 版本没有这样的构造函数
      • String text = "Hello"; s3client.putObject(bucket,fileNameWithOutExt+".txt" ,text);
      • S3Object 没有构造函数,它接受 2 个字符串参数
      • 1.11.20 或更高版本已重载上述方法@FakabbirAmin。请参阅docs.aws.amazon.com/AmazonS3/latest/dev/… 的示例
      【解决方案4】:

      用 PHP 有一个简单的方法,只需将字符串作为对象的主体发送,在键中指定新文件的名称 -

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

      这将根据指定的键创建一个新文件,该文件具有字符串中指定的内容。

      【讨论】:

        【解决方案5】:

        如果您使用的是 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);
            }
        }
        

        【讨论】:

          【解决方案6】:

          这对我有用:

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

          【讨论】:

            【解决方案7】:

            https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html 的示例代码适用于我。

            s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");
            

            看起来这是在 1.11.20 左右添加的,因此请确保您使用的是该版本或新版本的 SDK。

            https://javadoc.io/doc/com.amazonaws/aws-java-sdk-s3/1.11.20/com/amazonaws/services/s3/AmazonS3.html#putObject-java.lang.String-java.lang.String-java.lang.String-

            【讨论】:

              猜你喜欢
              • 2021-03-11
              • 2017-06-08
              • 1970-01-01
              • 2016-08-25
              • 1970-01-01
              • 2019-11-01
              • 2019-08-20
              • 2012-10-23
              • 2019-10-26
              相关资源
              最近更新 更多