【发布时间】:2011-01-30 17:53:01
【问题描述】:
如何在 amazon s3 上添加字符串作为文件?从我搜索的whaterver中,我知道我们可以将文件上传到s3。在不创建文件的情况下上传数据的最佳方式是什么?
【问题讨论】:
-
如果您的问题有更多详细信息,我建议您获得更多帮助。例如,您使用什么语言编写,以及您用于与 S3 交互的库(如果有)。
标签: amazon-s3 amazon-web-services
如何在 amazon s3 上添加字符串作为文件?从我搜索的whaterver中,我知道我们可以将文件上传到s3。在不创建文件的情况下上传数据的最佳方式是什么?
【问题讨论】:
标签: amazon-s3 amazon-web-services
有一个overload for the AmazonS3.putObject method 接受桶字符串、一个密钥字符串和一个文本内容字符串。我没有看到堆栈溢出时提到它,所以我把它放在这里。这将类似于@Jonik 的答案,但没有额外的依赖。
AmazonS3 s3client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
s3client.putObject(bucket, key, contents);
【讨论】:
看起来不太好,但这里是使用 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;
}
}
【讨论】:
上传数据的最佳方式是什么 不创建文件?
如果您的意思是不在 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);
【讨论】:
String text = "Hello"; s3client.putObject(bucket,fileNameWithOutExt+".txt" ,text);
用 PHP 有一个简单的方法,只需将字符串作为对象的主体发送,在键中指定新文件的名称 -
$s3->putObject(array(
'Bucket' => [Bucket name],
'Key' => [path/to/file.ext],
'Body' => [Your string goes here],
'ContentType' => [specify mimetype if you want],
));
这将根据指定的键创建一个新文件,该文件具有字符串中指定的内容。
【讨论】:
如果您使用的是 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);
}
}
【讨论】:
这对我有用:
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);
}
【讨论】:
https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html 的示例代码适用于我。
s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");
看起来这是在 1.11.20 左右添加的,因此请确保您使用的是该版本或新版本的 SDK。
【讨论】: