0

申し訳ありませんが、初心者の質問です。Djangoアプリケーションには、Webブラウザーからサーバーにファイルをアップロードできる非常に単純な関数があります(完全に機能します)。さて、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は、期待する形式が無効であるため、これを除外しません。Cf. その上:

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

1 に答える 1

2

enctypefrom HTMLフォームはContent-Type、HTTPリクエストのものである必要があります。現在、コンテンツタイプを'text/xml'代わりに設定しています。

また、ボディをマルチパートmimeオブジェクトとして構築する必要があります。この質問への回答には、そのためのコードが含まれているようです。iPhoneプログラミングでのHTTPサーバーへのファイルのアップロード

他のオプションは、クライアントを完全に制御できるため、HTTPPUT要求を実行することです。これは、実際には、元のコードで行っていたことに近いように見えます。メソッドを「PUT」に変更し、もう一方の端でDjangoフォームを使用しないでください。request.raw_post_dataにアクセスするだけで、完全なファイルデータを取得できます。

于 2012-01-21T16:03:00.897 に答える