2013-10-09 19 views
13

का उपयोग किए बिना एंड्रॉइड से अमेज़ॅन एस 3 तक फ़ाइलों को कैसे अपलोड करें मैं अपने एंड्रॉइड डिवाइस से एक बाल्टी में एक फ़ाइल अपलोड करने के लिए अमेज़ॅन के एस 3 के आरईएसटी एपीआई का उपयोग करने पर काम कर रहा हूं। मेरे पास कुंजी और SECRET_KEY है, लेकिन मुझे यकीन नहीं है कि हस्ताक्षर कैसे ठीक से उत्पन्न करें वे अपने अनुरोधों में देख रहे हैं। मैं अपने सर्वर पर एक HttpPut का उपयोग कर रहा हूँ, लेकिन मुझे यकीन नहीं है कि कैसे हस्ताक्षर Valal सही ढंग से उत्पन्न करने के लिए। अब तक यहाँ मैं क्या है: यहाँएसडीके

HttpPut put = new HttpPut(URL); 

      String fmt = "EEE, dd MMM yyyy HH:mm:ss "; 
      SimpleDateFormat format = new SimpleDateFormat(fmt, Locale.US); 
      format.setTimeZone(TimeZone.getTimeZone("GMT")); 

      String method = "PUT"; 
      String contentType = "application/octet-stream"; 
      String date = format.format(new Date()) + "GMT"; 
      String bucket = "/test-bucket52809/"; 

      StringBuffer buf = new StringBuffer(); 
      buf.append(method).append("\n\n"); 
      buf.append(contentType).append("\n"); 
      buf.append(date).append("\n"); 
      buf.append(bucket); 

      String signature = percentEncodeRfc3986(hmac(buf.toString())); 

फिर तरीकों मैं हस्ताक्षर मूल्य उत्पन्न करने के लिए का उपयोग कर रहे हैं:

private void setupMac() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException 
    { 

     byte[] secretyKeyBytes = KEY_SECRET.getBytes("UTF-8"); 
     signingKey = new SecretKeySpec(secretyKeyBytes, "HmacSHA256"); 
     mac = Mac.getInstance("HmacSHA256"); 
     mac.init(signingKey); 
    } 

    private String hmac(String stringToSign) { 
     String signature = null; 
     byte[] data; 
     byte[] rawHmac; 
     try { 
      data = stringToSign.getBytes("UTF-8"); 
      rawHmac = mac.doFinal(data); 
      signature = new String(Base64.encode(rawHmac, Base64.DEFAULT)); 
     } catch (UnsupportedEncodingException e) { 
      throw new RuntimeException("UTF-8" + " is unsupported!", e); 
     } 
     return signature; 
    } 

    private String percentEncodeRfc3986(String s) { 
     String out; 
     try { 
      out = URLEncoder.encode(s, "UTF-8").replace("+", "%20") 
        .replace("*", "%2A").replace("%7E", "~"); 
     } catch (UnsupportedEncodingException e) { 
      out = s; 
     } 
     return out; 
    } 

मैं अमेज़न S3 हस्ताक्षर परीक्षक इस्तेमाल किया, और मेरे स्ट्रिंग सही था, लेकिन मैं सही एन्कोडेड मूल्य कभी नहीं मिला। किसी भी मदद या सही दिशा में धक्का के लिए धन्यवाद।

+0

मैं एक ही चीज़ के लिए एडब्ल्यूएस जावा एसडीके स्रोत पर एक नज़र डालेगा। Http://github.com/aws/aws-sdk-java पर ढूंढना आसान होना चाहिए। – jarmod

+0

आप एसडीके का उपयोग क्यों नहीं करना चाहते हैं? इसमें हस्ताक्षर इत्यादि को संभालने के लिए कई बॉयलर प्लेट कोड शामिल हैं जो इन निम्न स्तर के विवरणों को संभालने से बचेंगे –

+0

क्या आपके पास इसका समाधान है? मैं एसडीके के बिना एस 3 पर अपलोड करने की कोशिश कर रहा हूं। – dannyroa

उत्तर

2
import sun.misc.BASE64Encoder; 
import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

String policy = (new BASE64Encoder()).encode(
    policy_document.getBytes("UTF-8")).replaceAll("\n","").replaceAll("\r",""); 

Mac hmac = Mac.getInstance("HmacSHA1"); 
hmac.init(new SecretKeySpec(
    aws_secret_key.getBytes("UTF-8"), "HmacSHA1")); 
String signature = (new BASE64Encoder()).encode(
    hmac.doFinal(policy.getBytes("UTF-8"))) 
    .replaceAll("\n", ""); 

[रेफरी: https://aws.amazon.com/articles/1434]

ऊपर के लिंक भी HTTP अनुरोध में इनपुट parameteres वर्णन करता है।

1

मैं दोबारा जांच करूँगा कि तिथि क्या है और http हेडर में भेजा गया है (क्या आप "x-amz-date" हेडर सेट कर रहे हैं?), यह "मैन्युअल रूप से" अनुरोधों पर हस्ताक्षर करते समय मुझे कुछ सिरदर्द देता है।

इसके अलावा, एस 3 से त्रुटि संदेश जोड़ने से हमें यह समझने में मदद मिल सकती है कि क्या गलत है और आपकी मदद करता है।