包含python请求的多部分表单数据生成器

2024-04-25 12:46:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在研究这个SpiderOak的Zipstream模块,它基本上允许你流式传输和压缩文件或文件夹,而无需向光盘写入任何内容。它产生大小不规则的数据块。在

现在,我尝试将一个目录上载到一个文件托管站点,该站点要求我在post请求中发送fileapikey字段。根据请求,我必须为apikey构建dict,如下所示:

data = {'apikey': 'myapikey'}

还可以将整个zipstream读入字符串并将其传递到编码dict的文件:

^{pr2}$

然后发出请求

r = requests.post(url, data=data, files=files).

这行得通。不过,我想在将来传输更大的内容,而在内存中读取整个文件是一个坏主意。 我在“请求高级”部分看到您可以发送一个生成器作为数据字段,但是之后我不能发送api密钥,必须手动修改头来设置内容类型和所有这些内容,这样它就不能工作了。还试图用api密钥和zip文件生成器生成一个字典 数据={ '文件':('我的目录.zip',生成器()), “apikey”:“myapikey” }在

但这失败了(如预期)。在

有没有一种方法可以利用一个生成器对多部分表单数据中的文件生成字符串,从而对请求进行黑客攻击?在


Tags: 文件数据字符串目录api内容data站点
1条回答
网友
1楼 · 发布于 2024-04-25 12:46:22

好吧,经过一番挣扎,我设法不需要请求,而是使用模块poster。在

首先,我为zipstream创建了一个fileobject包装器,如下所示:

from zipstream import ZipStream

class Zipit:
  def __init__( self, path):
    self.it = iter(ZipStream(path,compression=0))
    self.next_chunk = ""
    self.length = -1
    self.path = path
    self.__is_zipit__=''    
  @property
  def size(self):
    if self.length < 0:
      self.length = 0
      zip_object = ZipStream(self.path,compression=0)
      for data in zip_object:
        self.length += len(data)
    return self.length

  def growChunk( self ):
    self.next_chunk = self.next_chunk + self.it.next()
  def read( self, n ):
    if self.next_chunk == None:
      return None
    try:
      while len(self.next_chunk)<n:
        self.growChunk()
      rv = self.next_chunk[:n]
      self.next_chunk = self.next_chunk[n:]
      return rv
    except StopIteration:
      rv = self.next_chunk
      self.next_chunk = None
      return rv

为了有一个简单的api(代码不知羞耻地改编自另一个例子)。在

然后根据poster的文档创建必要的多部分对象:

^{pr2}$

最后一种方法是跳过重置,以防fileobject字段是Zipit实例:

   def reset(self):
        if hasattr(self.fileobj, '__is_zipit__'): return
        if self.fileobj is not None:
            self.fileobj.seek(0)
        elif self.value is None:
            raise ValueError("Don't know how to reset this parameter")

这对我有用。希望这能对你们五个读到这篇文章的人有所帮助。在

相关问题 更多 >