Выгрузка на Amazon S3 услуг от iPhone App

голоса
5

Я потянув меня за волосы на этом ... Я использую ASIHTTPRequest ( http://allseeing-i.com/ASIHTTPRequest/ ) библиотеку оболочки для доступа к памяти Amazon S3. Я могу подключиться только штрафом и захватить распечатку ведра без каких - либо проблем. Мое разочарование в попытку ЗАГРУЗИТЬ (PUT и / или POST) новый объект (фото) к существующему ведру. Я выполняю документацию Amazon к письму, (по крайней мере , я думаю , что я.) , Но ничего не похоже на работу.

Пожалуйста, кто-то поможет мне, прежде чем я выпрыгнуть из окна. Я не хочу умирать. :-(

Заранее спасибо за любую помощь я могу получить.

L.

Задан 28/06/2009 в 01:40
источник пользователем
На других языках...                            


4 ответов

голоса
12

Вот простой пример использования PUT. Очевидно, что вы должны использовать очереди, а не синхронный запрос в реальном мире.

Если вы измените заголовки АМЗ, не забудьте обновить «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[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    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];
}
Ответил 28/06/2009 в 11:11
источник пользователем

голоса
1

Существует также набор соединения рамки какао, который способен загружать данные в различные услуги, в том числе Amazon S3. Я уверен , что у него есть некоторые отправные точки для вас в его источнике.

Ответил 28/06/2009 в 12:21
источник пользователем

голоса
11

В случае, если это полезно для тех, кто найти этот вопрос - поддержка Basic S3 теперь встроена в ASIHTTPRequest:

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

Я думал о добавлении поддержки S3 для возрастов, но ваш вопрос подтолкнул его к передней части очереди :)

Ответил 14/07/2009 в 12:02
источник пользователем

голоса
2

Похоже , есть IOS SDK от Амазонки в настоящее время, в настоящее время (апрель 2011) в бета - версии: http://aws.amazon.com/sdkforios/ .

Ответил 26/04/2011 в 16:07
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more