2013-04-09 192 views
0

在python中有一個很好的庫'base64',該模塊可以根據文件名和內容對文件進行編碼/解碼。我正在開發一個具有上傳文件功能的API。我設法編寫一些代碼來對這些文件進行編碼和解碼,但通過HTTP請求發送此編碼的base64消息的正確方法是什麼?什麼是通過HTTP通過base64編碼發送文件的最佳方式

  • 通過POST,只需將文件名和編碼的消息放入一個後置參數?
  • 在標題裏面?

歡迎任何想法,如果可能的話顯示一個小的http請求你應該怎麼做。

+1

您可能想要先閱讀這篇文章:http://stackoverflow.com/questions/8659808/how-does-http-file-upload-work – 2013-04-09 08:43:29

+0

我對fileupload不感興趣,重點是我需要通過API傳輸文件。有可能通過單獨的參數傳遞文件名和base64編碼的消息,但我堅持如何阻止文件> 10MB例如 – user1839924 2013-04-09 12:32:02

回答

2

我最近不得不這樣做,因爲django-tastypie不支持multipart/form-dataklipstein已創建Base64FileField以支持使用base64編碼文件的文件上傳。

這裏是基於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" 
} 

什麼是最好的方法?

不確定這是否是最好的方法,但它簡單明瞭。

+0

Oki,我也在考慮這種方式,但是如何阻止文件>例如在這種情況下10MB? – user1839924 2013-04-09 12:30:47

+0

我已經更新了文件大小檢查的答案。 – pankaj28843 2013-04-09 13:10:01

相關問題