2012-01-21 11 views
0

申し訳ありません、初心者の質問:Djangoアプリケーションで、Webブラウザからサーバーにファイルをアップロードできる非常に簡単な機能があります(完璧に動作します)。さて、Webブラウザではなく、iPhoneを使いたいと思います。iPhoneからDjangoにファイルをアップロード

Djangoに有効なフォームを提供する方法がわからないので、私はちょっと立ち往生しました。つまり、わかっている限り、ファイル名とenctype = "multipart/form-data"が必要です。ここで

はジャンゴでの私のアップロード機能である:

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アプリからサーバーに。 私は本当にどのように知らない:enctype

  • が、それはDjangoが
  • これはを読むことができる形式でだことを確認してください指定

  • ファイル名を提供

    1. どのくらい私が得たか:

      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。上:HTMLフォームから

  • 答えて

    2

    enctype HTTPリクエストのContent-Typeをする必要があります。現在、コンテンツタイプを'text/xml'に設定しています。

    また、本体を複数パートのMIMEオブジェクトとして構築する必要があります。 File Upload to HTTP server in iphone programming

    あなたのクライアントを完全に制御しているので、HTTP PUTリクエストを行うこともできます。実際には、元のコードで行っていたことに近いものになります。メソッドを 'PUT'に変更し、もう一方の端でDjangoフォームを使用しないでください。単にrequest.raw_post_dataにアクセスして完全なファイルデータを取得してください。

    +0

    ありがとうございますが、それでも動作しません。今私は例外: "マルチパートで無効な境界:なし"を取得する境界とは何ですか、どのように設定する必要がありますか?ご協力いただきありがとうございます! –

    +0

    NSString * boundary = [NSString stringWithString:@ "のようなもの---------------------------境界線-------- ------------------- "]; NSString * contentType = [NSString stringWithFormat:@ "マルチパート/フォームデータ;境界=%@"、境界]; [addValue:contentType forHTTPHeaderField:@ "Content-Type"]を要求します。 –

    +0

    もしそうなら、今私は境界線が何であるか考えました。ランダムですか? –

    関連する問題