2010-03-23 180 views
15

如何在amazon s3上添加字符串作为文件?从我搜索的whaterver,我知道我们可以上传一个文件到s3。上传数据而不创建文件的最佳方式是什么?如何将字符串写入Amazon S3存储桶?

+1

如果你的问题有更多的细节,我建议你会得到更多的帮助。比如你正在写什么语言,以及你用什么库来与S3交互。 – RickMeasham 2010-04-04 09:07:57

回答

3

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

如果你的意思是没有在S3上创建文件,那么你不能这么做。在Amazon S3上,只有存储数据的方式是以文件形式存在,或者使用更准确的术语,对象。一个对象可以包含 1个字节零字节到5太字节的数据,并存储在存储桶中。亚马逊的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); 
+1

S3中的对象也可以是零字节大小,而不是您建议的最小值。 :) – chilts 2012-06-08 03:00:16

+13

你如何做到这一点使用亚马逊API,S3Object的版本没有这样的构造函数 – 2015-04-24 09:13:42

10

不看起来不错,但这里是你如何使用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

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

这个工作对我来说:

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

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

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

有一个简单的方法用PHP来做到这一点,只需发送字符串作为对象的身体,在密钥的指定新的文件的名称 -

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

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

1

我很惊讶没有人在这里有正确的答案。有关Java API,请参阅 official documentation

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

欲了解更多编程语言,请查询here

+0

是不是[redirectLocation](https://docs.aws.amazon。com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/PutObjectRequest.html#PutObjectRequest-java.lang.String-java.lang.String-java.lang.String-)? – Valentin 2018-02-03 17:00:13

+0

根据[文档](https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html)。这是如何完成的。 – 2018-02-05 12:30:54

+0

这篇文档是关于上传文件的,没有关于将内容上传为字符串的内容。最简单和正确的解决方案在这里 - https://stackoverflow.com/a/42510981/7374267 – Valentin 2018-02-05 19:23:40

相关问题