I'm new to both Django and IOS. I got stuck in this multipart data passing and need your advice!
Currently, I am working on an image-uploading function. From client side, I want to send the image file together with additional information (e.g. access_token). On the server side, I try to get the json data via request.raw_post_data and image via reuqest.FILES
It turns out that, I could only get either JSON data or Image, not both. What's worse, client side only returns 500 error with no other information...
Here's client code
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];
And I tried two methods on the server side. one is with form which gave me 500 error
form = UploadFileForm(request.POST, request.FILES)
the other is like below (pls ignore the indentation problem)
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"
}
with the second method, I could get image uploaded but no access_token found. I'm wondering where the access_token has been stored -.-||| Or is it the problem with client side?
Your help is much appreciated!!!!
it should be the problem of the server side. instead of getting from request.raw_post_data
, the token information is actually in request.POST
. so it would be like:
ck_token = request.POST['access_token']
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With