Как написать строку в ведро Amazon S3?
Как добавить строку в файл на amazon s3? От whaterver, который я искал, я узнал, что мы можем загрузить файл на s3. Каков наилучший способ загрузки данных без создания файла?
Ответы
Ответ 1
Каков наилучший способ загрузки данных без создания файла?
Если вы имели в виду без создания файла на S3, вы не можете этого сделать. На Amazon S3 единственный способ хранения данных - это файлы или использование более точной терминологии, объектов. Объект может содержать от 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);
Ответ 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
Существует перегрузка для метода AmazonS3.putObject, который принимает строку bucket, ключевую строку и строку текстового содержимого. Я не видел упоминания об этом при переполнении стека, поэтому я помещаю это здесь. Это будет похоже на @Jonik ответ, но без дополнительной зависимости.
AmazonS3 s3client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
s3client.putObject(bucket, key, contents);
Ответ 4
Если вы используете 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);
}
}
Ответ 5
Существует простой способ сделать это с PHP, просто отправьте строку как тело объекта, указав имя нового файла в ключе -
$s3->putObject(array(
'Bucket' => [Bucket name],
'Key' => [path/to/file.ext],
'Body' => [Your string goes here],
'ContentType' => [specify mimetype if you want],
));
Это создаст новый файл в соответствии с указанным ключом, который имеет содержимое, указанное в строке.
Ответ 6
Я удивлен, что никто не имеет правильного ответа здесь.
s3Client.putObject(new PutObjectRequest(S3_BUCKET_NAME, fileName, rawString));
Ответ 7
Это работает для меня:
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);
}