2012-02-10 24 views
0

私はDjangoの機能を実装して、クライアント(iPhoneアプリ)からAmazon S3サーバに画像をアップロードしようとしています。 iPhoneアプリケーションは、HTTPBodyのイメージの内容を含むHttpRequest(メソッドPUT)を送信します。例えば、クライアントは、次のURLにイメージを置く:http://127.0.0.1:8000/uploadimage/sampleImage.png/PUT経由でDjangoでファイルをアップロード

ジャンゴでの私の機能は、PUT要求を処理し、S3にファイルを保存するために次のようになります。

def store_in_s3(filename, content): 
    conn = S3Connection(settings.ACCESS_KEY, settings.PASS_KEY) # gets access key and pass key from settings.py 
    bucket = conn.create_bucket("somepicturebucket") 
    k = Key(bucket) 
    k.key = filename 
    mime = mimetypes.guess_type(filename)[0] 
    k.set_metadata("Content-Type", mime) 
    k.set_contents_from_string(content) 
    k.set_acl("public-read") 

def upload_raw_data(request, name): 
    if request.method == 'PUT': 
     store_in_s3(name,request.raw_post_data) 
     return HttpResponse('Upload of raw data to S3 successful') 
    else: 
     return HttpResponse('Upload not successful') 

私の問題は、どのようにあります私の関数に画像の名前を教えてください。私urls.pyでは、私は次のようしているが、それは動作しません。

url(r'^uploadrawdata/(\d+)/', upload_raw_data), 

限り、私は承知しているとして、D +は数字の略で、私はの名前を渡すとき、それはここでは役に立たないのは明らかですファイル。しかし、私はこれが最初の正しい方法であるかどうか疑問に思っていました。私はこの記事hereを読んで、それは私が全く理解していない次のコード行を示している。また、私は、コードの残りの部分はすべてに約あるか見当もつかない

file_name = path.split("/")[-1:][0] 

を。私はこれに少し慣れているので、単に画像をアップロードする方法の提案は大歓迎です。ありがとう!

答えて

1

この質問は実際にアップロードすることではなく、リンクされた回答は無関係です。 URLの数字ではなく文字列を受け入れたい場合は、ファイル名を渡すために、dの代わりにwを正規表現に使用してください。

明確にするために編集申し訳ありませんが、ファイル+拡張子全体を渡そうとしています。

r'^uploadrawdata/(.+)/$' 

これは、任意の文字と一致するようにします。あなたはおそらく正規表現の紹介を読むべきです。

+0

ありがとうダニエル。しかし、なぜリンクされた答えは無関係ですか? PUT経由でアップロードをしようとしていますか?私は基本的に何かをやっている気がします。おそらく私は私の目的のためにPUTを使うべきではありません、あるいは、おそらく私は理解していないリンクされた答えのコードをいくつか持っているべきです... –

+0

また、私はURLを試しました(r '^ uploadrawdata /(\ w +)/ '、upload_raw_data) - エラーメッセージ "現在のURL、uploadrawdata/MD5-HASH-SOMETHING.png/がこれらのいずれとも一致しませんでした。" http://127.0.0.1:8000/uploadrawdata/MD5-HASH-SOMETHING.png/にPUTしようとすると –

関連する問題