2013-04-03 6 views
5

Sono nuovo sia per Django che per IOS. Sono rimasto bloccato in questo passaggio di dati multipart e ho bisogno del tuo consiglio!Django con IOS: acquisizione di dati multiparte (json + immagine) via POST

Attualmente sto lavorando a una funzione di caricamento delle immagini. Dal lato client, voglio inviare il file immagine insieme a informazioni aggiuntive (ad esempio, access_token). Sul lato server, cerco di ottenere i dati JSON via request.raw_post_data e immagine via reuqest.FILES

Si scopre che, ho potuto ottenere solo dati JSON o Immagine, non entrambi. Quel che è peggio, lato client restituisce solo errore 500 senza altre informazioni ...

Ecco il codice cliente

NSURL *url = [NSURL URLWithString:urlPath]; 
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 

// The parameter to send 
NSDictionary * params = dictionaryToSent; 

// the image need to upload 
NSData *imageData = UIImageJPEGRepresentation(image, 1); 
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"" parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { 
    [formData 
    appendPartWithFileData:imageData 
    name:@"image" 
    fileName:@"uniqueFileName" 
    mimeType:@"image/jpeg"]; 
}]; 

AFJSONRequestOperation* jsonOperation=[[AFJSONRequestOperation alloc]initWithRequest:request]; 

[jsonOperation setUploadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { 

    NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite); 

}]; 

[jsonOperation setCompletionBlockWithSuccess: ^(AFHTTPRequestOperation *operation, id JSON) { 

    // Handler for request is completed  
}failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //Handler for request is failured; 
}]; 

[jsonOperation start]; 

e ho provato due metodi sul lato server di . uno è con la forma che mi ha dato 500 errore

form = UploadFileForm(request.POST, request.FILES) 

l'altro è come qui di seguito (pls ignorare il problema indentazione)

data=json.loads(request.raw_post_data) 
ck_token = data['access_token'] 
if 'image' in request.FILES: 
upload = request.FILES['image'] 
filename = upload.name 
user = Basic.objects.get(ck_token = ck_token) 
post = Post(user_id = user.user_id, image = upload, caption = "Hello World") 
post.save() 
ret_json = { 
    'success': True, 
    'post_id': post.id 
} 
else: 
ret_json = { 
    'success': False, 
    'error_message': "image not found" 
} 

con il secondo metodo, ho potuto ottenere immagine caricata ma non access_token trovato. Mi chiedo dove sia stato salvato l'access_token -.- ||| O è il problema con il lato client?

Il vostro aiuto è molto apprezzato !!!!

+0

supponendo che il token di accesso sia fondamentalmente inviato su ogni richiesta al server, perché non mantenere il token di accesso nell'autenticazione dell'intestazione? questo è quello che faccio ... – crizzwald

+0

@crizzwald grazie per il suggerimento. probabilmente è un modo migliore :) – xialin

risposta

1

dovrebbe essere il problema del lato server. invece di ottenere da request.raw_post_data, le informazioni del token sono in realtà in request.POST. quindi sarebbe come:

ck_token = request.POST['access_token'] 
Problemi correlati