0

Python には素敵なライブラリ 'base64' があり、このモジュールを使用すると、ファイル名とコンテンツに基づいてファイルをエンコード/デコードできます。ファイルをアップロードする機能を持つ API を開発しています。これらのファイルをエンコードおよびデコードするコードを書くことができましたが、このエンコードされた base64 メッセージを HTTP リクエストで送信する正しい方法は何ですか?

  • POST を介して、ファイル名とエンコードされたメッセージを投稿パラメーターに入れるだけですか?
  • ヘッダーの内側?

可能であれば、小さな http リクエストをどのように行うべきかを示してください。

4

1 に答える 1

2

django-tastypieはmultipart/form-dataをサポートしていないため、最近これを行う必要がありました。klipsteinは、ファイルの base64 エンコーディングを使用してファイルのアップロードをサポートするBase64FileFieldを作成しました。

Base64FileField に基づく例を次に示します。

#models.py
from django.db import models

class Person(models.Model):
    name = models.CharField("name", max_length=40)
    avatar = models.ImageField("avatar", upload_to="uploads/person_avatars")

    def __unicode__(self):
        return self.name

#views.py
import json
import base64
import sys
from django.core.files.uploadedfile import SimpleUploadedFile
from django.http import HttpResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt

from .models import Person

MAX_SIZE = 10*1024*1024 #10MB

@csrf_exempt
def save_person(request):
    if (request.method == "POST" and request.META.get("CONTENT_TYPE")
        == "application/json"):
        data = json.loads(request.raw_post_data)
        avatar = data.get("avatar")
        file = base64.b64decode(avatar["file"])
        if sys.getsizeof(file) > MAX_SIZE:
            response = {"error": {
                "code": "invalid_request",
                "message": "Max file size exceeded."
                }}
            return HttpResponseBadRequest(json.dumps(response),
                mimetype="application/json")

        person = Person(name=data.get("name"), avatar=SimpleUploadedFile(
            avatar["name"],
            file,
            getattr(avatar, "content_type", "application/octet-stream")))
        person.save()

        response = {"id": person.id, "name": person.name,
            "avatar": person.avatar.url}
        return HttpResponse(json.dumps(response), mimetype="application/json")

    response = {"error": {
        "code": "invalid_request",
        "message": "Method Not Allowed."
        }}
    return HttpResponseBadRequest(json.dumps(response),
        mimetype="application/json")

上記のビューに投稿される JSON 本文の例を次に示します。

{
    "name": "Test User",
    "avatar": {
        "name": "myfile.png",
        "file": "a long base64 encoded string ",
        "content_type": "image/png"
    }
}

応答の例は次のとおりです。

{
    "id": 1,
    "avatar": "/media/uploads/person_avatars/myfile.png",
    "name": "Test User"
}

最善の方法は何ですか?

これが最善の方法かどうかはわかりませんが、単純明快です。

于 2013-04-09T10:29:39.323 に答える