2012-05-09 36 views
6

Tôi đã nhận được đoạn mã đơn giản này đang cố gắng tải tệp lên Amazon S3 qua proxy. Đây là mã:Máy khách Amazon S3 kết nối thông qua proxy - putObject nhận NullPointerException

BasicAWSCredentials basicCred = new BasicAWSCredentials("my_access_key", "my_secret_key"); 
    ClientConfiguration clientCfg = new ClientConfiguration(); 
    clientCfg.setProtocol(Protocol.HTTP); 

    //setup proxy connection: 
    clientCfg.setProxyHost("192.168.2.12"); 
    clientCfg.setProxyPort(80); 




    AmazonS3 s3 = new AmazonS3Client(basicCred, clientCfg); 


    String bucketName = "mybucket"; 
    String key = "/test/Capture.JPG"; 
    File file = new File("d:/Test_Data/Capture.JPG"); 

    System.out.println("Uploading a new object to S3 from a file"); 
    s3.putObject(new PutObjectRequest(bucketName, key, file)); 

Tuy nhiên đây là lỗi tôi nhận được từ chạy chương trình:

Exception in thread "main" java.lang.NullPointerException 
    at com.amazonaws.util.BinaryUtils.fromHex(BinaryUtils.java:69) 
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1066) 
    at javaapplication8.JavaApplication8.main(JavaApplication8.java:48) 
Java Result: 1 

Tôi đang sử dụng AWS mới nhất 1.3.8 sdk từ amazon. Proxy được thiết lập trong một máy tính khác bên cạnh tôi và nó chỉ là một proxy Javascript đơn giản (http://www.catonmat.net/http-proxy-in-nodejs/)

Tôi không thể hiểu tại sao . Ai đó có thể giúp tôi, làm ơn?

+0

Sau khi điều tra thêm, tôi phát hiện ra rằng đó là hexData là null trong hàm: công byte tĩnh [] fromHex (String hexData) từ dòng BinaryUtils.java 69. Có cách nào khác để tôi có thể lấy thêm thông tin gỡ lỗi không? – Eugene

+0

CẬP NHẬT: Tôi đã gặp vấn đề tương tự với AWS SDK 1.6.7, có vẻ như tất cả đang hoạt động sau khi cập nhật lên 1.9.35 – sscarduzio

Trả lời

3

Tôi cũng gặp sự cố này. Tôi đã hướng dẫn mọi thứ trong một trình gỡ lỗi và thấy rằng nguyên nhân của vấn đề là mã máy khách Amazon S3 mong đợi một thẻ tiêu đề có tên là "ETag", nhưng phản hồi chứa "Etag", với chữ thường "t".

Các tiêu đề được đưa vào một Map<String,String>, vì vậy khi mã khách hàng Amazon S3 gọi get("ETag"), nó được trở lại null, sau đó được đưa vào phương pháp hexData() và thổi lên.

Điều này dường như xảy ra với một số người sử dụng dịch vụ không phải của Amazon S3 hoặc truy cập dịch vụ AWS S3 của Amazon thông qua proxy web.

Tôi không biết sửa lỗi nào ngoài việc lấy nguồn khách hàng Amazon, thay đổi giá trị Headers.ETAG thành "Etag" và tự xây dựng chính mình là JAR.

+1

Nếu bạn không biết câu trả lời thì hãy đặt làm nhận xét và không trả lời – DevelopmentIsMyPassion

+5

Tôi đã cung cấp câu trả lời, không chỉ đơn giản. Nó yêu cầu xây dựng lại máy khách JAR S3. Tôi hy vọng có một câu trả lời tốt hơn ở đâu đó. – jds

+1

đây là câu trả lời tồi tệ nhất mà tôi từng đọc trên SO. Nếu bạn quyết tâm không xóa câu trả lời này, bạn có thể cải thiện nó bằng các liên kết đến nguồn, số dòng cho các dòng mã cần được thay đổi và các ví dụ về cách thay đổi sẽ trông như thế nào. –

0

Thay đổi giao thức thành HTTPS.

$ clientCfg.setProtocol (Protocol.HTTPS);

+0

Xin lưu ý rằng các câu hỏi bắt đầu từ năm 2012, khi sử dụng kết nối HTTP ** S ** không được sử dụng rộng rãi như hiện nay. – KarelG

1

đây là cách tiếp cận khác,

ClientConfiguration config = new ClientConfiguration(); 
config.setProtocol(Protocol.HTTPS); 
config.setProxyHost("YOUR_PROXY_IP"); 
config.setProxyPort(YOUR_PROXY_PORT); 

BasicAWSCredentials creds = new BasicAWSCredentials("YOUR_KEY", "YOUR_SECRET"); 
s3Client = AmazonS3ClientBuilder.standard() 
       .withClientConfiguration(config) 
       .withRegion(Regions.US_EAST_2) 
       .withCredentials(new AWSStaticCredentialsProvider(creds))     
       .build(); 
Các vấn đề liên quan