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 !!!!
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
@crizzwald grazie per il suggerimento. probabilmente è un modo migliore :) – xialin