【问题标题】:Upload image from iOS to Django将图像从 iOS 上传到 Django
【发布时间】:2014-10-01 11:36:46
【问题描述】:

我需要帮助来基本了解如何通过发布请求将文件上传到 Django 视图。这是我想将图片上传到的 Django 表单:

https://domfa.de/upload_profile/

这是这个确切的 Django 视图 URL 的 views.py 代码:

def profile_picture(request):
    if request.POST:
        form = UserProfileForm(request.POST, request.FILES)
        obj = form.save(commit=False)
        obj.user_id = request.user.id
        obj.profile_picture = obj.profile_picture
        obj.save()            
        return render_to_response('profile.html', args, RequestContext(request))                
    else:
        formNew = UserProfileForm()
        args = {}
        args.update(csrf(request))
        args['uid'] = request.user.id
        args['form'] = formNew
        return render_to_response('profile.html', args, RequestContext(request))

实际的表格非常简单,只有一个字段用于实际的个人资料图片:

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('profile_picture',)

    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)

所以 Django 方面工作得很好,只要我登录,我总是能够成功上传图像。但是我被困在如何将图像发布到这个极其简单的 Django 视图中,我'已经使用单独的 NSUrl 请求以用户身份登录到 Django 服务器:

UIImage *picture = [UIImage imageNamed:@"myFile.png"];

NSData *imageData = UIImagePNGRepresentation(picture);

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                initWithURL:[NSURL
                                             URLWithString:@"https://domfa.de/upload_profile/"]];

[request setHTTPMethod:@"POST"];
[request setValue:@"image/png"   forHTTPHeaderField:@"Content-type"];
[request setHTTPBody:imageData];

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSLog(@"%@", returnData);

所以假设所有 Django 代码都可以正常工作,那么我的实际图片上传的 Objective-c 代码有什么问题?

另外,我如何在 NSLog 中从服务器获取响应消息,以便更好地了解服务器不接受文件 POST 请求的原因?

【问题讨论】:

    标签: ios objective-c django post image-uploading


    【解决方案1】:

    从 iOS 发送 HTTP 请求时获取反馈

    问题是您没有传递指向 NSURLResponse 对象的指针,您可以在发出请求后对其进行检查。

    NSURLResponse *response;
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    

    现在您可以通过查看对象来检查输出。

    为什么不上传?

    您的方法存在几个问题:您正在使用 django 的表单 API,这没问题,但是您的代码中有两个缺陷:

    CSRF 您在提交表单时没有正确设置 CSRF 值。您可以通过首先使用 GET 请求访问您的表单来解决它,就像浏览器那样,然后从服务器设置的 cookie 中获取 CSRF 令牌,然后发送包含检索到的 CSRF 令牌的 POST 请求。另见CSRF handling in AJAX requests

    数据编码 您不是将表单数据发送回视图,而是原始数据。这不会以这种方式工作。您必须发送正确的 POST 表单数据。您可以手动完成,也可以使用ASIHTTPRequest,它抽象了multipart/form-data 的繁琐处理。

    我会重新考虑使用表单以编程方式上传图片的设计决策。为什么不为此使用更像 REST API 的东西呢?在 django 中实现干净的 REST API 有很多很棒的框架(例如 http://tastypieapi.org/)。

    也许查看 Twitter 和 app.net 的 API 描述可以帮助启发您如何构建它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 2017-07-29
      • 2020-09-16
      • 2015-04-27
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多