7

Web フォームではなく、アプリ (iOS android など) からの投稿。

class someImage(models.Model):
    image = models.ImageField(upload_to= settings.SHARE_IMAGE_UPLOAD_PATH)

@csrf_exempt
def saveImage(request):

ビューの書き方は?投稿リクエストで画像を受け取ります。私が見つけたものはすべてフォーム関連です(サーバー初心者)

4

2 に答える 2

16

ModelForm実際の HTML フォームを使用してデータを送信していないからといって、 を使用してリクエストを処理できないわけではありません。

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed
from django.utils import simplejson

def upload_view(request):
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            result = {'success': True}
            return HttpResponse(simplejson.dumps(result), mimetype='application/json')
        else:
            return HttpResponseBadRequest()
    else:
       return HttpResponseNotAllowed(['POST'])
于 2012-01-11T17:52:22.050 に答える
5

編集: 上記で選択した回答を使用してください - 以下のコードは質問に対して機能しますが、お勧めしません。

アップロードする画像ファイルは次の場所にあります。

request.FILES['image'] # assuming input name is called 'image'

Image オブジェクトではなく UploadedFile オブジェクトを返します。ドキュメントのこの部分を読むことができます (Django 1.3.x を使用していると仮定しています): https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

UploadedFile オブジェクトで使用できるフィールドとメソッド、およびファイルのアップロードを手動で処理する一般的な方法について説明します。同じ方法を使用して、画像ファイルをファイル オブジェクトに書き込み、それを ImageField に保存できます。

次のコードは機能するはずですが、安全なコードではありません。*nix マシンを使用していると仮定していますが、そうでない場合は、宛先ファイルを別の場所に保存してください。

@csrf_exempt
def saveImage(request):
    # warning, code might not be safe
    up_file = request.FILES['image']
    destination = open('/tmp/' + up_file.name , 'wb+')
    for chunk in up_file.chunks():
        destination.write(chunk)
    destination.close()
    img = someImage()
    img.image.save(up_file.name, File(open('/tmp/' + up_file.name, 'r')))
    img.save()
    # return any response you want after this

その他の注意事項: フォームが機能するためには、フォームに次の属性があることを確認してください。

 <form enctype="multipart/form-data" ... >

この使い方が普通だった記憶はありませんが、本当は Forms が推奨されています。

于 2012-01-11T16:35:53.260 に答える