2013-06-03 57 views
2

我有一個圖像文件,它是從輸入字段中選擇並通過django中的表單發佈的。從文件輸入字段發佈InMemoryUploadedFile到另一個外部服務器

表單數據和圖像我想張貼到另一臺服務器 。

問題似乎是,請求中的文件數據是一個InMemoryUploadedFile類型,它需要與其他發佈數據(json格式)一起轉換。

基本上我的代碼是:

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

def some_view(request): 
    files=None 
    if request.FILES: 
     key = 'expected_image_name' #something else here, but not relevant 
     if key in request.FILES: 
      memfile = request.FILES.get(key, None) 
      if memfile: 
       files={} 
       # note this works: but does not upload the file: 
       # files["image"]= memfile.read() 
       # So trying a lot of other things, like: 
       files["image"]= ContentFile(memfile.read(), name=memfile.name).read() 
    # I also retrieve some data from request.Post... but for simplycity lets say it is: 
    post_values = {"some_other_field": "whatever"} 
    register_openers() 
    url="My post url" 
    # for simplycity I leave out the authentication, the problem is not in there 
    if files: 
     multi_data=post_values 
     multi_data.update(files) 
     datagen, headers = multipart_encode(multi_data) 
     request = urllib2.Request(url, datagen, headers) 
     response = urllib2.urlopen(request) 
    else: 
     request = urllib2.Request(url) 
     response = urllib2.urlopen(request,data) 

無論我嘗試...該文件不會被上傳到服務器。

記錄的responese ......該項目創建......但圖像= NULL

任何人,我在這裏可以俯瞰什麼建議....

編輯週二2013 - 6 - 4

我放在這個記錄在最後:「如果文件的部分 logger.debug( 'DEBUG:datagen:%s' 的%datagen) logger.debug( 'DEBUG:標題:%s' 的%標頭)

我得到這個那邊:

DEBUG get_response: datagen: <poster.encode.multipart_yielder instance at 0x7fdb7cca4200> 
DEBUG get_response: headers: {'Content-Length': '30349', 'Content-Type': 'multipart/form-data; boundary=baa9e321554a49c6b626c68860a90aaf'} 

等詳細信息: 我從jQuery的輸入形式發送它

在HTML表單的外觀:

<form data-ajax="false" id="form_5" method="post" enctype="multipart/form-data" action="My url to the view above"> 
    <div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='z47GsVwsBOzu3HrUMIZaI4hoyV2ljLVa' /></div> 
    <!-- and some other fields in input fields --> 
    <input type="file" name="expected_image_name" data-role="button" id="expected_iamge_name" value="Select photo"/> 
    <input type="submit" value="Submit"> 
</form> 
+0

在最後如果?它會進入'if files:'還是直接進入'else:'? –

+0

@PauloBu:看我最後的編輯。 –

回答

0

這是有益的:Post request with multipart/form-data in appengine python not working

看來multipart_encode不能直接取內存文件...

,所以我改變了我的代碼中:

增加進口:

from poster.encode import MultipartParam 

files["image"]= MultipartParam("image", filename=memfile.name, filetype=memfile.content_type, fileobj=memfile.file) 

而且這個作品!

相關問題