2009-06-28 14 views
5

मैं इस पर अपने बालों को खींच रहा हूं ... मैं अमेज़ॅन एस 3 स्टोरेज तक पहुंचने के लिए ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/) रैपर लाइब्रेरी का उपयोग कर रहा हूं। मैं बस ठीक से कनेक्ट करने और किसी भी समस्या के बिना बाल्टी की एक सूची पकड़ने में सक्षम हूं। मेरी निराशा मौजूदा बाल्टी में एक नई ऑब्जेक्ट (एक फोटो) को अपलोड करने (PUT और/या POST) करने का प्रयास कर रही है। मैं पत्र में अमेज़ॅन के दस्तावेज का पालन कर रहा हूं, (कम से कम मुझे लगता है कि मैं हूं।) लेकिन कुछ भी काम नहीं करता है।आईफोन ऐप से अमेज़ॅन एस 3 सेवाओं को अपलोड करना

कृपया, कोई खिड़की से बाहर निकलने से पहले मेरी मदद करें। मैं जान से हाथ नहीं धोना चाहता हूं। :-(

धन्यवाद किसी भी मदद के लिए मैं प्राप्त कर सकते हैं।

एल

+0

हम्मम्म - 'यह काम नहीं करता' से परे किसी भी विवरण के बिना मदद करने के लिए बहुत मुश्किल है। क्या विशेष रूप से? किस तरह से विफल रहता है? कोड? आपने क्या प्रयास किया है – Hunter

उत्तर

12

यहाँ रखा का उपयोग कर एक बुनियादी उदाहरण है। जाहिर है आप एक कतार नहीं बल्कि वास्तविक में एक तुल्यकालिक अनुरोध से उपयोग करना चाहिए दुनिया।

आप AMZ हेडर को बदलते हैं, अमेज़न के निर्देशों के अनुसार 'canonicalizedAmzHeaders' अद्यतन करने के लिए मत भूलना।

#import "ASIHTTPRequest.h" 
#import <CommonCrypto/CommonHMAC.h> 

... 

- (void)testS3 
{ 
    NSString *filePath = @"/path/to/file"; 
    NSString *contentType = @"text/plain"; 
    NSString *bucket = @"mybucket"; 
    NSString *path = @"test"; 
    NSString *secretAccessKey = @"my-secret-access-key"; 
    NSString *accessKey = @"my-access-key"; 

    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzzz"]; 
    NSString *date = [dateFormatter stringFromDate:[NSDate date]]; 

    ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@.s3.amazonaws.com/%@",bucket,path]]] autorelease]; 
    [request setPostBodyFilePath:filePath]; 
    [request setShouldStreamPostDataFromDisk:YES]; 
    [request setRequestMethod:@"PUT"]; 

    [request addRequestHeader:@"x-amz-acl" value:@"private"]; 
    [request addRequestHeader:@"Content-Type" value:contentType]; 
    [request addRequestHeader:@"Date" value:date]; 

    NSString *canonicalizedAmzHeaders = @"x-amz-acl:private"; 
    NSString *canonicalizedResource = [NSString stringWithFormat:@"/%@/%@",bucket,path]; 
    NSString *stringToSign = [NSString stringWithFormat:@"PUT\n\n%@\n%@\n%@\n%@",contentType,date,canonicalizedAmzHeaders,canonicalizedResource]; 

    NSString *signature = [self base64forData:[self HMACSHA1withKey:secretAccessKey forString:stringToSign]]; 
    NSString *auth = [NSString stringWithFormat:@"AWS %@:%@",accessKey,signature]; 
    [request addRequestHeader:@"Authorization" value:auth]; 


    [request start]; 
    NSLog(@"%@",[request responseString]); 

} 


// Source: http://stackoverflow.com/questions/476455/is-there-a-library-for-iphone-to-work-with-hmac-sha-1-encoding 

- (NSData *)HMACSHA1withKey:(NSString *)key forString:(NSString *)string 
{ 
    NSData *clearTextData = [string dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; 

    uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; 

    CCHmacContext hmacContext; 
    CCHmacInit(&hmacContext, kCCHmacAlgSHA1, keyData.bytes, keyData.length); 
    CCHmacUpdate(&hmacContext, clearTextData.bytes, clearTextData.length); 
    CCHmacFinal(&hmacContext, digest); 

    return [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 
} 

//Source http://www.cocoadev.com/index.pl?BaseSixtyFour 

- (NSString *)base64forData:(NSData *)data 
{ 
    static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

    if ([data length] == 0) 
     return @""; 

    char *characters = malloc((([data length] + 2)/3) * 4); 
    if (characters == NULL) 
     return nil; 
    NSUInteger length = 0; 

    NSUInteger i = 0; 
    while (i < [data length]) 
    { 
     char buffer[3] = {0,0,0}; 
     short bufferLength = 0; 
     while (bufferLength < 3 && i < [data length]) 
      buffer[bufferLength++] = ((char *)[data bytes])[i++]; 

     // Encode the bytes in the buffer to four characters, including padding "=" characters if necessary. 
     characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2]; 
     characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)]; 
     if (bufferLength > 1) 
      characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)]; 
     else characters[length++] = '='; 
     if (bufferLength > 2) 
      characters[length++] = encodingTable[buffer[2] & 0x3F]; 
     else characters[length++] = '=';  
    } 

    return [[[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES] autorelease]; 
} 
+0

आप रॉक पॉकब। वास्तव में मदद की सराहना करते हैं। मेरा canonicalizedAmzHeader सभी खराब था। मुझे एक और समस्या है हालांकि ... मैंने कतार में अनुरोध जोड़ने "और" वहां से शुरू करने की कोशिश की लेकिन इसका कोई फायदा नहीं हुआ। यहां मेरा कोड है: [networkQueue cancelAllOperations]; [अनुरोध ..... परिभाषाएं यहां जाएं]; [networkQueue addOperation: अनुरोध]; [networkQueue go]; कतार में अनुरोध जोड़ने के दौरान मुझे किन चीजों पर ध्यान देना चाहिए? सहायता के लिए फिर से धन्यवाद! एल –

+0

क्या आपने पहले कतार बनाई थी? (उदाहरण: [स्वयं सेटनेटवर्क्यूयू: [ASINetworkQueue कतार]]) – pokeb

+0

आप फिर से सही थे। मेरा नेटवर्क क्यूयू इंस्टेंस वैरिएबल कभी शुरू नहीं हुआ था। तुम आदमी हो। वास्तव में मदद की सराहना करते हैं। –

1

वहाँ भी है Connection Kit कोको फ्रेमवर्क, जो अमेज़ॅन एस 3 समेत विभिन्न सेवाओं के लिए डेटा अपलोड करने में सक्षम है। मुझे पूरा यकीन है कि इसके स्रोत में आपके लिए कुछ शुरुआती बिंदु हैं।

11

मामले में यह इस सवाल खोजने किसी के लिए भी उपयोगी है - मूल S3 समर्थन अब ASIHTTPRequest करने के लिए बनाया गया है:

http://allseeing-i.com/ASIHTTPRequest/S3

मैं उम्र के लिए S3 समर्थन जोड़ने के बारे में सोच रहा था, लेकिन आपके सवाल का यह धकेल दिया था कतार के सामने :)

+0

नाइस! मुझे रैपर पसंद है। मैं तुम्हारा सबसे बड़ा प्रशंसक बन गया हूँ। अच्छा काम करते रहो! –

+0

सुंदर पुस्तकालय के लिए धन्यवाद! :) –

2

ऐसा लगता है कि अब अमेज़ॅन से आईओएस एसडीके है, वर्तमान में (अप्रैल 2011) बीटा में: http://aws.amazon.com/sdkforios/

संबंधित मुद्दे