0

抱歉,初学者的问题:我的 Django 应用程序中有一个非常简单的功能,我可以使用它从 Web 浏览器将文件上传到我的服务器(完美运行!)。现在,我想使用 iPhone,而不是网络浏览器。

我有点卡住了,因为我真的不知道如何为 Django 提供有效的表单,即据我所知,我们需要一个文件名和 enctype="multipart/form-data"。

这是我在 Django 中的上传功能:

class UploadFileForm(forms.Form):
    file  = forms.FileField()

def handle_uploaded_file(f):
    destination = open('uploads/example.txt', 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            print form
            print request.FILES
            return HttpResponse('Upload Successful')
    else:
        form = UploadFileForm()
    return render_to_response('upload.html', {'form': form})

我的模板看起来像这样(upload.html):

<form action="" method="post" enctype="multipart/form-data">
    {{ form.file }}
    {{ form.non_field_errors }}
    <input type="submit" value="Upload" />
</form>

现在,假设我想将一个简单的 txt 文件从我的 iPhone 应用程序发送到服务器。 我真的不知道如何

  1. 提供文件名
  2. 指定enctype
  3. 确保它是 Django 可以读取的格式

这是我走了多远:

NSString *fileContents = [self loadTXTFromDisk:@"example.txt"];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
                                initWithURL:[NSURL 
                                             URLWithString:@"http://127.0.0.1:8000/uploadfile/"]];


[request setHTTPMethod:@"POST"];
[request setValue:@"text/xml"   forHTTPHeaderField:@"Content-type"];
[request setValue:[NSString stringWithFormat:@"%d", [fileContents length]] 
                                forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:[fileContents dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *theConnection = [[NSURLConnection alloc] 
                                  initWithRequest:request 
                                  delegate:self];

但是,Django 不会例外,因为它期望的形式是无效的。参照。以上:

form = UploadFileForm(request.POST, request.FILES)
if form.is_valid(): #this will not be true ...
4

1 回答 1

2

来自enctypeHTML 表单的应该是Content-TypeHTTP 请求的。您当前正在将内容类型设置为'text/xml'

您还必须将主体构建为多部分 mime 对象。这个问题的答案似乎有一些代码:File Upload to HTTP server in iphone programming

由于您可以完全控制客户端,因此您的另一个选择是执行 HTTP PUT 请求。这实际上看起来更接近于您使用原始代码所做的事情。将方法更改为“PUT”,并且不要在另一端使用 Django 表单;只需访问 request.raw_post_data 即可获取完整的文件数据。

于 2012-01-21T16:03:00.897 回答