2010-03-23 32 views
15

Làm cách nào để thêm chuỗi dưới dạng tệp trên amazon s3? Từ người tôi tìm kiếm, tôi đã biết rằng chúng tôi có thể tải tệp lên s3. Cách tốt nhất để tải lên dữ liệu mà không cần tạo tệp là gì?Làm thế nào để viết một chuỗi vào thùng S3 của Amazon?

+1

Tôi khuyên bạn nên nhận thêm trợ giúp nếu câu hỏi của bạn có nhiều chi tiết hơn. Chẳng hạn như ngôn ngữ bạn đang viết và thư viện nào, nếu có, bạn đang sử dụng để tương tác với S3. – RickMeasham

Trả lời

3

Cách tốt nhất để tải lên dữ liệu mà không cần tạo tệp là gì?

Nếu bạn có nghĩa là không tạo tệp trên S3, tốt, bạn không thể thực sự làm điều đó. Trên Amazon S3, chỉ cách lưu trữ dữ liệu dưới dạng tệp hoặc sử dụng thuật ngữ chính xác hơn, đối tượng. Một đối tượng có thể chứa từ 1 byte 0 byte đến 5 terabyte dữ liệu và được lưu trữ trong một thùng . Amazon S3 homepage lays out the basic facts quite clearly. (Đối với các tùy chọn lưu trữ dữ liệu khác trên AWS, bạn có thể muốn đọc ví dụ: SimpleDB.)

Nếu bạn muốn tạo tệp tạm thời cục bộ thì câu trả lời tùy thuộc vào thư viện/công cụ bạn đang sử dụng. (Như RickMeasham gợi ý, xin vui lòng bổ sung thêm chi tiết!) Với công cụ s3cmd, ví dụ, bạn không thể bỏ qua việc tạo ra tập tin tạm thời, trong khi với các thư viện Java JetS3t tải lên một String trực tiếp would be easy:

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

Một đối tượng trong S3 cũng có thể có kích thước bằng 0 byte, không phải là đối tượng tối thiểu như bạn đề xuất. :) – chilts

+13

Cách bạn thực hiện điều này bằng cách sử dụng API Amazons, phiên bản S3Object không có hàm tạo như vậy –

10

Liệu không trông đẹp, nhưng đây là cách bạn có thể làm điều đó bằng cách sử dụng Amazon khách hàng Amazon, có lẽ những gì JetS3t làm đằng sau hậu trường anyway.

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

Nếu bạn đang sử dụng java, hãy kiểm tra 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

này làm việc cho tôi:

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

Có một overload for the AmazonS3.putObject method chấp nhận chuỗi xô, một chuỗi chìa khóa, và một chuỗi nội dung văn bản. Tôi đã không nhìn thấy đề cập đến nó trên stack tràn vì vậy tôi đặt này ở đây. Nó sẽ tương tự như câu trả lời của @ Jonik, nhưng không có sự phụ thuộc bổ sung.

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

Có một cách đơn giản để làm điều đó với PHP, chỉ cần gửi các chuỗi như cơ thể của đối tượng, xác định tên của tập tin mới trong khóa -

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

này sẽ tạo tệp mới theo khóa được chỉ định, có nội dung như được chỉ định trong chuỗi.

1

Tôi ngạc nhiên không ai có câu trả lời đúng ở đây. Xem official documentation tại đây cho API Java.

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

Để biết thêm ngôn ngữ lập trình, vui lòng kiểm tra here.

+0

Không phải là [redirectLocation] (https: //docs.aws.amazon.com/AWSJavaSDK/mới nhất/javadoc/com/amazonaws/services/s3/model/PutObjectRequest.html # PutObjectRequest-java.lang.String-java.lang.String-java.lang.String-)? – Valentin

+0

Theo [tài liệu] (https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html). Đó là cách nó được thực hiện. –

+0

Tài liệu này là về tải lên tệp, không có gì về việc tải lên nội dung dưới dạng Chuỗi. Giải pháp đơn giản và chính xác nhất là ở đây - https://stackoverflow.com/a/42510981/7374267 – Valentin

Các vấn đề liên quan