4

簡単な REST クライアントを使用してテストしています。単純な JPEG を送信して、次の content-Type を試しました: Content-Type: image/jpeg Content-Type: multipart/form-data

外部のサードパーティ REST 接続を許可するために、csrftoken 認証がオフになっていることにも注意してください。

(画像は残りのクライアント経由で添付されています)wiresharkをチェックし、パケットは上記のパラメーターに従ってセットアップされます。

Django - request オブジェクトにはいくつかの変数があります: request.body request.FILES

POST が Django サーバーによって受信された後、リクエスト オブジェクトは常にすべてのデータ/ペイロードを request.body に格納します。画像や添付ファイルを request.FILES に入れてはいけませんか? content-type または POST で何かが正しく設定されていませんか。

非常に単純なコード。ログに出力しようとしているだけです。post 内のすべてのオブジェクトは request.body に移動し続けます

def testPost(request):
     print request.body
     print request.FILES
     return HttpResponse()

Wireshark パケット:

Hypertext Transfer Protocol
POST /testPost/ HTTP/1.1\r\n
Host: MYURL.com:8000\r\n
Connection: keep-alive\r\n
Content-Length: 8318\r\n
Origin: chrome-extension://aejoelaoggembcahagimdiliamlcdmfm\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36\r\n
Content-Type: image/jpeg\r\n
Accept: */*\r\n
Accept-Encoding: gzip,deflate,sdch\r\n
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4\r\n
Cookie: ******; csrftoken=**********\r\n
\r\n
[Full request URI: http://MYURL.com:8000/testPost/]
[HTTP request 1/1]

JPEG ファイル交換フォーマット

4

1 に答える 1

3

ファイルのアップロードを処理する方法は次のとおりです。この場合、たまたま画像です。私がしばらくの間戦った問題の 1 つは、request.FILES が複数のキーを受け取る可能性があり、常に最後のキーが欲しかったということでした。

注: request.FILES には、次の場合にのみデータが含まれます。

  1. リクエストは POST です
  2. リクエストには属性「enctype="multipart/form-data"」があります

詳細については、Django ファイルアップロードのドキュメントを参照してください。

モデル:まず、ImageField を含むモデルがあります: models.py

photos_dir = settings.MEDIA_ROOT + "/photos" + "/%Y/%m/%d/"

class Photo(models.Model):
   image    = models.ImageField(upload_to=photos_dir, null=True, blank=True, default=None)
   filename = models.CharField(max_length=60, blank=True, null=True)

ビュー: views.pyで投稿を処理します:

from django.core.files.images import ImageFile

def upload_image( request ):

   file_key=None
   for file_key in sorted(request.FILES):
      pass

   wrapped_file = ImageFile(request.FILES[file_key])
   filename = wrapped_file.name

   # new photo table-row 
   photo = Photo()
   photo.filename = filename
   photo.image = request.FILES[file_key]

   try:
      photo.save()
   except OSError:
      print "Deal with this situation"

   # do your stuff here.
   return HttpResponse("boo", "text/html");

Standlone ポスター: django ビューを刺激する Python コード。

参照: 私は実際にこの lib: poster.encodeを使用して、django view.py に「データを刺激」しました。

from poster.streaminghttp import register_openers
from poster.encode import multipart_encode
import urllib2

server = "http://localhost/"
headers = {}

# Register the streaming http handlers with urllib2
register_openers()

img="path/to/image/image.png"

data = {'media' : open( img ),
        'additionalattr': 111,
}
datagen, headers = multipart_encode(data)

headers['Connection']='keep-alive'
request = urllib2.Request('%s/upload_image/' % ( server ), datagen, headers)

print urllib2.urlopen(request).read() 
于 2014-01-05T08:04:30.900 に答える