Загрузить файл с iPhone в Django - PullRequest
0 голосов
/ 21 января 2012

Извините, вопрос новичка: у меня в приложении Django есть очень простая функция, с помощью которой я могу загрузить файл из веб-браузера на свой сервер (работает отлично!).Теперь вместо веб-браузера я бы хотел использовать 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 на сервер. Я действительно не знаю, как :

  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 ...

1 Ответ

2 голосов
/ 21 января 2012

enctype из HTML-формы должно быть Content-Type HTTP-запроса. Вместо этого вы устанавливаете тип контента на 'text/xml'.

Вы также должны будете построить тело как составной объект пантомимы. Ответы на этот вопрос, кажется, содержат код для этого: Загрузка файла на HTTP-сервер при программировании на iphone

Другой вариант, поскольку у вас есть полный контроль над клиентом, это сделать запрос HTTP PUT. Это на самом деле выглядит ближе к тому, что вы делали с вашим исходным кодом. Измените метод на «PUT» и не используйте форму Django на другом конце; просто получите доступ к request.raw_post_data, чтобы получить полные данные файла.

...