将文件从iPhone上传到Django

问题描述 投票:0回答:1

对不起,初学者的问题:我的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>

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

  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 ...
iphone objective-c django django-forms nsmutableurlrequest
1个回答
2
投票

HTML表单中的enctype应该是HTTP请求的Content-Type 。 您当前正在将内容类型设置为'text/xml'

您还必须将主体构建为多部分mime对象。 这个问题的答案似乎有一些代码: 在iphone编程中文件上传到HTTP服务器

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

© www.soinside.com 2019 - 2024. All rights reserved.