Амазонка multipart загрузить API для Mac - PullRequest
0 голосов
/ 08 февраля 2012

Последние два дня я ищу в Google информацию об использовании Amazon Multipart Upload Api в моем проекте Cocoa для Mac. Я скачал AWS SDK для IOS. Но не нашел, как использовать этот SDK в проекте какао. Может ли кто-нибудь предоставить мне пример кода для достижения многоэтапной загрузки с помощью многоэтапной загрузки amazon S3 ???

Edit:
Поскольку AWS SDK для IOS не совместим с приложениями Cocoa, я использую Rest api для загрузки файла с помощью libcurl. Я использую следующий код (взяв ссылку из http://dextercoder.blogspot.in/2012/02/multipart-upload-to-amazon-s3-in-three.html):

- (void)initUpload
{
    NSDate* now = [NSDate date];
    NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];

    [formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    [formatter setDateFormat:@"eee, dd MMM yyyy HH:mm:ss "];
    NSString *strDate = [NSString stringWithFormat:@"%@GMT", [formatter stringFromDate:now]];
    NSString *strDateString = [NSString stringWithFormat:@"Date: %@", strDate];
    const char *date = [strDateString UTF8String];

    NSString *stringToSign = [NSString stringWithFormat:@"POST\n\n\n%@\n/MY_BUCKET/test.pdf?uploads",strDate];
    NSString *signature = [self base64forData:[self HMACSHA1withKey:MY_SECRET forString:stringToSign]];
    signature = [signature stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
    signature = [signature stringByReplacingOccurrencesOfString:@"/" withString:@"%2F"];
    signature = [signature stringByReplacingOccurrencesOfString:@"=" withString:@"%3D"];
    NSString *strAuthorization = [NSString stringWithFormat:@"Authorization: AWS MY_ACCESSID:%@", signature];
    const char *sig = [strAuthorization UTF8String];

    curl_global_init(CURL_GLOBAL_ALL);
    CURL *curlHandle = curl_easy_init();
    struct curl_slist *headers=NULL;
    headers = curl_slist_append(headers, date);
    headers = curl_slist_append(headers, sig);
    CURLcode res;


    if (curlHandle) {
        curl_easy_setopt(curlHandle, CURLOPT_URL, "http://MY_BUCKET.s3.amazonaws.com/test.pdf?uploads");
        curl_easy_setopt(curlHandle, CURLOPT_POST, 1);
        curl_easy_setopt(curlHandle, CURLOPT_POSTFIELDS, "");
        curl_easy_setopt(curlHandle, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curlHandle, CURLOPT_VERBOSE,1L);            
        res = curl_easy_perform(curlHandle);

        curl_easy_cleanup(curlHandle);       
    }
}

- (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];
}

- (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];
}

Но это дает ответ

" SignatureDoesNotMatch Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи. "


Есть идеи, что я делаю не так ???

Ответы [ 2 ]

0 голосов
/ 25 февраля 2012

Вы можете сослаться на код Java из http://dextercoder.blogspot.in/2012/02/multipart-upload-to-amazon-s3-in-three.html. рассказывает, как загрузить файл в нескольких частях без AWS.

0 голосов
/ 08 февраля 2012

У вас есть базовые примеры сервисов AWS, таких как S3, SDB и т. Д., Предоставляемых самим SDK: http://docs.amazonwebservices.com/mobile/sdkforios/gsg/Welcome.html?r=1498

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...