1

multipart_encodeプロセスを実現するためにを使用してファイルをアップロードしようとしていMIMEます。しかし、次のエラーが発生しましAttributeError: multipart_yielder instance has no attribute '__len__'た。以下は私のアプローチです。誰かが私にいくつかの提案をしてくれるなら本当に感謝しています。

url = "https://pi-user-files.s3-external-1.amazonaws.com/"           
post_data = {}
#data is a dict
post_data['AWSAccessKeyId']=(data['ticket']['AWSAccessKeyId'])
post_data['success_action_redirect']=(data['ticket']['success_action_redirect'])
post_data['acl']=(data['ticket']['acl'])
post_data['key']=(data['ticket']['key'])
post_data['signature']=(data['ticket']['signature'])
post_data['policy']=(data['ticket']['policy'])
post_data['Content-Type']=(data['ticket']['Content-Type'])

#I would like to upload a text file "new 2"
post_data['file']=open("new  2.txt", "rb")

datagen, headers = multipart_encode(post_data)
request2 = urllib2.Request(url, datagen, headers)
result = urllib2.urlopen(request2)
4

2 に答える 2

3

ファイルを送信する場合は、他のパラメーターをMultipartParamオブジェクトでラップする必要があります。ファイル送信リクエストを作成するコード例:

from poster.encode import multipart_encode, MultipartParam
import urllib2

def postFileRequest(url, paramName, fileObj, additionalHeaders={}, additionalParams={}):
    items = []
    #wrap post parameters
    for name, value in additionalParams.items():
        items.append(MultipartParam(name, value))
    #add file
    items.append(MultipartParam.from_file(paramName, fileObj))
    datagen, headers = multipart_encode(items)
    #add headers
    for item, value in additionalHeaders.iteritems():
        headers[item] = value
    return urllib2.Request(url, datagen, headers)

register_openers()また、最初に一度実行する必要があると思います。ドキュメントで見つけることができるいくつかの詳細

于 2012-05-11T06:59:37.437 に答える
2

問題は、httplib.py では、ジェネレーターがそのように検出されず、代わりに、送信される完全なデータを保持する文字列のように扱われることです (したがって、その長さを見つけようとします)。

if hasattr(data,'read') and not isinstance(data, array): # generator 
    if self.debuglevel > 0: print "sendIng a read()able"
    ....

解決策は、ジェネレーターを read()able のように動作させることです。

class GeneratorToReadable():
    def __init__(self, datagen):
        self.generator = datagen
        self._end = False
        self.data = ''

    def read(self, n_bytes):
        while not self._end and len(self.data) < n_bytes:
            try:
                next_chunk = self.generator.next()
                if next_chunk:
                    self.data += next_chunk
                else:
                    self._end = True
            except StopIteration:
                self._end = True
        result = self.data[0:n_bytes]
        self.data = self.data[n_bytes:]
        return result

そして次のように使用します:

datagen, headers = multipart_encode(post_data)
readable = GeneratorToReadable(datagen)
req = urllib2.Request(url, readable, headers)
result = urllib2.urlopen(req)
于 2019-02-10T19:06:44.650 に答える