2009-06-28 16 views
5

Sto tirando i miei capelli su questo ... Sto usando la libreria di wrapper ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/) per accedere all'archivio Amazon S3. Sono in grado di connettermi perfettamente e di prendere un elenco di bucket senza problemi. La mia frustrazione è nel provare a UPLOAD (PUT e/o POST) un nuovo oggetto (una foto) in un bucket esistente. Sto seguendo la documentazione di Amazon alla lettera, (almeno credo di esserlo), ma niente sembra funzionare.Caricamento su Amazon S3 Services dall'app per iPhone

Per favore, qualcuno mi aiuti prima di saltare da una finestra. Non voglio morire :-(

Grazie in anticipo per qualsiasi aiuto che posso ottenere.

L.

+0

Hmmmm: difficile da aiutare senza dettagli oltre "non funziona". Cosa specificamente? Non funziona in che modo? Codice? Che cosa hai provato? – Hunter

risposta

12

Ecco un esempio di base utilizzando PUT. Ovviamente si deve usare una coda piuttosto che una richiesta sincrona nel reale mondo.

Se si modificano le intestazioni AMZ, non dimenticate di aggiornare 'canonicalizedAmzHeaders' secondo le istruzioni di 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

You Rock pokeb. Apprezzo davvero l'aiuto. Il mio canonizzato AsmHeader era tutto matto. Tuttavia ho un altro problema ... Ho provato a "aggiungere" la richiesta a una coda e avviarla da lì ma senza successo. Ecco il mio codice: [networkQueue cancelAllOperations]; [richiesta ..... le definizioni vanno qui]; [networkQueue addOperation: request]; [networkQueue go]; Quali sono le cose a cui prestare attenzione quando aggiungo una richiesta a una coda? grazie ancora per l'aiuto! L. –

+0

Hai creato prima la coda? (ad esempio: [self setNetworkQueue: [ASINetworkQueue queue]]) – pokeb

+0

Avevi ragione. La mia variabile di istanza networkQueue non è mai stata inizializzata. Tu sei l'uomo. Apprezzo davvero l'aiuto. –

1

V'è anche la Connection Kit Struttura di cacao, che è in grado di caricare dati su diversi servizi, tra cui Amazon S3. Sono abbastanza sicuro che abbia alcuni punti di partenza per te nella sua fonte.

11

Nel caso in cui è utile per chiunque trovare questa domanda - Supporto di base S3 è ora integrata in ASIHTTPRequest:

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

avevo pensato di aggiungere il supporto S3 per le età, ma la tua domanda gomitata esso nella parte anteriore della coda :)

+0

NICE! Adoro il wrapper. Sono diventato il tuo più grande fan. Continuate così! –

+0

grazie per la bella biblioteca! :) –

Problemi correlati