2012-05-09 32 views
6

我有這段簡單的代碼試圖通過代理上傳文件到Amazon S3。這是代碼:亞馬遜S3客戶端通過代理連接 - putObject獲取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)); 

然而,這是我從運行程序得到了錯誤:

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 

我使用的是最新的AWS從亞馬遜1.3.8 SDK。代理是在另一臺PC旁邊設置的,它只是一個簡單的Javascript代理(http://www.catonmat.net/http-proxy-in-nodejs/)

我不明白爲什麼。有人可以幫助我嗎?

+0

經過進一步調查,我發現這是hexData是函數空: 公共靜態的byte []從BinaryUtils.java線fromHex(字符串hexData)其他那些我可以獲得更多調試信息的方法呢? – Eugene

+0

更新:我有與AWS SDK 1.6.7相同的問題,它似乎現在所有工作後,更新到1.9.35 – sscarduzio

回答

3

我也遇到了這個問題。我在調試器中逐步瞭解所有內容,發現問題的原因是Amazon S3客戶端代碼期望標題標籤"ETag",但響應包含"Etag",其小寫字母爲"t"

的頭被放入Map<String,String>,所以當亞馬遜S3客戶代碼調用get("ETag"),它回來null,然後將其送入hexData()方法和鼓起。

這似乎發生在使用非Amazon S3服務或通過Web代理訪問Amazon的AWS S3服務的許多人身上。

我不知道除了抓住亞馬遜客戶端源,修改Headers.ETAG值到"Etag"和自己建立JAR修復。

+1

如果你不知道答案,然後請把作爲評論,而不是回答 – DevelopmentIsMyPassion

+5

我提供了一個答案,只是不是一個簡單的。它需要重建S3客戶端JAR。我希望在那裏有更好的答案。 – jds

+1

這是我見過的最差的答案。如果您決定不刪除此答案,則可以通過指向源代碼的鏈接,需要更改代碼行的行號以及更改應該如何顯示的示例來改進它。 –

0

將協議更改爲HTTPS。

$ clientCfg.setProtocol(Protocol.HTTPS);

+0

請注意,從2012年起,使用HTTP ** S **連接的問題日期並未得到廣泛使用,因爲它現在是時候了。 – KarelG

1

這裏是另一種方法,

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();