2013-04-03 15 views
5

Jestem nowy zarówno dla Django, jak i IOS. Utknąłem w tym wieloczęściowym przekazywaniu danych i potrzebuję twojej porady!Django z IOS: pobieranie danych wieloczęściowych (json + obraz) przez POST

Obecnie pracuję nad funkcją przesyłania obrazów. Ze strony klienta chcę wysłać plik obrazu wraz z dodatkowymi informacjami (np. Access_token). Po stronie serwera staram się uzyskać dane json za pośrednictwem request.raw_post_data i obrazu przez reuqest.FILES

Okazuje się, że mogłem uzyskać tylko dane JSON lub obraz, a nie oba. Co gorsza, po stronie klienta tylko zwraca błąd 500 bez innych informacji ...

Oto kod klienckim

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

Próbowałem dwóch metod po stronie serwera . jeden jest z formy, która dała mi błąd 500

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

drugi jest jak poniżej (pls ignorować problemu wcięcia)

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" 
} 

z drugiej metody, mogę uzyskać obraz przesłany ale nie access_token znaleźć. Zastanawiam się, gdzie został zapisany klucz dostępu -.- ||| Czy jest to problem ze stroną klienta?

Twoja pomoc jest bardzo cenna !!!!

+0

zakładając, że token dostępu jest zasadniczo wysyłany przy każdym żądaniu na serwer, dlaczego nie wystarczy zachować token dostępu w autoryzacji nagłówka? to co robię ... – crizzwald

+0

@crizzwald dzięki za sugestię. to chyba lepszy sposób :) – xialin

Odpowiedz

1

powinien to być problem po stronie serwera. zamiast uzyskać od request.raw_post_data, informacja tokena jest w rzeczywistości request.POST. więc byłoby tak:

ck_token = request.POST['access_token']