是否有替代pycurl.FORM_FILE的选项,可以接受字符串或流对象?

1 投票
2 回答
1186 浏览
提问于 2025-04-20 01:45

我最近开始使用pycurl,现在正在用setop pycurl.FORM_FILE。不过我想发送的数据是一个字符串,所以为了让下一个方法能读取它,写个文件就显得有点奇怪。

所以我想问的是:有没有其他方法可以替代pycurl.FORM_FILE,直接发送一个字符串或者一个流对象(就像文件对象那样)?

这就像libcurl中的FORM_STREAM。

readdata和readfunction在处理多部分表单的POST请求时是行不通的。

像这样:

import pycurl
c = pycurl.Curl()

c.setopt(c.URL, 'http://someurl')
c.setopt(c.FORM_FILE, 'myfile.gz')
c.perform()

c.close()

会变成:

import pycurl
c = pycurl.Curl()

fobj = open('myfile.gz', 'rb')
c.setopt(c.URL, 'http://someurl')
c.setopt(c.FORM_STREAM, fobj)
c.perform()
fobj.close()
c.close()

提前谢谢大家!

2 个回答

0

看看 StringIO,它的详细信息可以在这个链接找到:https://docs.python.org/2/library/stringio.html。这个东西可以让你创建一个像文件一样的对象。

>>> import StringIO
>>> f_obj = StringIO.StringIO('foo')
 >>> dir(f_obj)
['__doc__', '__init__', '__iter__', '__module__', 'buf', 'buflist', 'close', 'closed', 'flush', 'getvalue', 'isatty', 'len', 'next', 'pos', 'read', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines']
>>> 
2

好的,我找到了解决办法。

我需要的方法是 pycurl.FORM_BUFFER 和 pycurl.FORM_BUFFERPTR。

你可以在下面的测试中找到它的用法:https://github.com/pycurl/pycurl/blob/66f2dec7838ed920a45e57520b95e99928396d93/tests/post_test.py

注意:如果你使用的是旧版本的 pycurl,可能没有这个功能。

撰写回答