2009-06-28 39 views
5

Tôi đang kéo tóc ra trên cái này ... Tôi đang sử dụng thư viện trình bao bọc ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/) để truy cập bộ nhớ Amazon S3. Tôi có thể kết nối tốt và lấy danh sách các nhóm mà không gặp bất kỳ sự cố nào. Nỗi thất vọng của tôi là cố gắng UPLOAD (PUT và/hoặc POST) một đối tượng mới (ảnh) cho một nhóm hiện có. Tôi đang theo tài liệu của Amazon cho lá thư, (ít nhất tôi nghĩ là tôi.) Nhưng không có gì có vẻ hiệu quả.Tải lên Dịch vụ S3 của Amazon từ iPhone App

Xin vui lòng, ai đó giúp tôi trước khi tôi nhảy ra ngoài cửa sổ. Tôi không muốn chết. :-(

Cảm ơn trước sự giúp đỡ nào tôi có thể nhận được.

L.

+0

Hmmmm - khá khó để giúp đỡ mà không có bất kỳ chi tiết nào ngoài 'nó không hoạt động'. Điều gì đặc biệt? Không theo cách nào? Mã? Bạn đã thử cái gì? – Hunter

Trả lời

12

Dưới đây là một ví dụ cơ bản sử dụng PUT. Rõ ràng bạn nên sử dụng một hàng đợi chứ không phải là một yêu cầu đồng bộ trong thực tế thế giới.

Nếu bạn thay đổi các tiêu đề AMZ, đừng quên cập nhật 'canonicalizedAmzHeaders' theo hướng dẫn của Amazon.

#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

Bạn Rock pokeb. Thực sự đánh giá cao sự giúp đỡ. MyicalizedAmzHeader của tôi là tất cả các screwy. Tôi đang gặp một vấn đề khác tuy nhiên ... Tôi đã cố gắng "thêm" yêu cầu vào hàng đợi và bắt đầu từ đó nhưng vô ích. Đây là mã của tôi: [networkQueue cancelAllOperations]; [yêu cầu ..... định nghĩa đi ở đây]; [networkQueue addOperation: request]; [networkQueue go]; Tôi nên lưu ý những điều gì khi thêm yêu cầu vào hàng đợi? một lần nữa cảm ơn sự giúp đỡ! L. –

+0

Trước tiên bạn đã tạo hàng đợi chưa? (ví dụ: [self setNetworkQueue: [ASINetworkQueue queue]]) – pokeb

+0

Bạn đã quay lại ngay. Biến cá thể networkQueue của tôi chưa bao giờ được khởi tạo. Bạn là người đàn ông. Thực sự đánh giá cao sự giúp đỡ. –

1

cũng là Connection Kit Khung cacao, có thể tải dữ liệu lên các dịch vụ khác nhau, bao gồm Amazon S3. Tôi khá chắc chắn nó có một số điểm khởi đầu cho bạn trong nguồn của nó.

11

Trong trường hợp nó rất hữu ích cho bất cứ ai tìm kiếm câu hỏi này - Hỗ trợ cơ bản S3 hiện đang được xây dựng trong để ASIHTTPRequest:

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

Tôi đã suy nghĩ về việc thêm hỗ trợ S3 cho các lứa tuổi, nhưng câu hỏi của bạn huých nhẹ vào nó ở phía trước hàng đợi :)

+0

NICE! Tôi yêu các wrapper. Tôi đã trở thành người hâm mộ lớn nhất của bạn. Kịp các công việc tuyệt vời! –

+0

cảm ơn bạn vì thư viện đáng yêu! :) –

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