【问题标题】:Post an InMemoryUploadedFile from a file input field to another external server将文件输入字段中的 InMemoryUploadedFile 发布到另一个外部服务器
【发布时间】:2013-05-30 03:13:20
【问题描述】:

我有一个从输入字段中选择并通过 django 中的表单发布的图像文件。

我要发布到另一台服务器的表单数据和图像 .

问题好像是,request中的文件数据是InMemoryUploadedFile类型,需要和其他posted数据一起转换(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)

无论我尝试什么...文件都不会上传到服务器。

记录响应...项目已创建...但图像 = null

有人建议我在这里俯瞰什么......

编辑 2013 年星期二 - 6 - 4

我把这个日志放在最后:'if files'部分 logger.debug('DEBUG: datagen: %s' % datagen) logger.debug('DEBUG: headers: %s' % headers)

我在那边拿到了这个:

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>

【问题讨论】:

  • 在最后一个如果?是进入if files:还是直接进入else:
  • @PauloBu:看我最后的编辑。

标签: python django urllib2 image-uploading poster


【解决方案1】:

这很有帮助: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)

这行得通!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多