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 !!!!
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
@crizzwald dzięki za sugestię. to chyba lepszy sposób :) – xialin