使用python http post从内存上传二进制数据或文件

时间:2011-01-28 20:41:41

标签: python

我已经看到了通过multipartform-datapycurl上传文件的信息。
两种方法似乎都需要磁盘上的文件。
是否可以修改这些配方以从内存而不是从磁盘提供二进制数据?我想我可以使用xmlrpc server代替。
我想绕过必须对二进制数据进行编码和解码并将其原始发送...
执行pycurl和mutlipartform -data使用原始数据?

5 个答案:

答案 0 :(得分:2)

这个(小)库将采用文件描述符,并将执行HTTP POST操作:https://github.com/seisen/urllib2_file/

您可以将StringIO对象(包含内存数据)作为文件描述符传递给它。

答案 1 :(得分:1)

查找cas文件句柄的内容。然后只需传递一个StringIO对象而不是真正的文件描述符。

答案 2 :(得分:1)

我今天遇到了类似的问题,在尝试了pycurl和multipart / form-data之后,我决定阅读python httplib / urllib2源代码以找出答案,我确实得到了一个比较好的解决方案:

  1. 在发布
  2. 之前设置Content-Length标头(文件)
  3. 在发布帖子时传递打开的文件
  4. 以下是代码:

    import urllib2, os
    image_path = "png\\01.png"
    url = 'http://xx.oo.com/webserviceapi/postfile/'
    length = os.path.getsize(image_path)
    png_data = open(image_path, "rb")
    request = urllib2.Request(url, data=png_data)
    request.add_header('Cache-Control', 'no-cache')
    request.add_header('Content-Length', '%d' % length)
    request.add_header('Content-Type', 'image/png')
    res = urllib2.urlopen(request).read().strip()
    return res
    

    请参阅我的博文:http://www.2maomao.com/blog/python-http-post-a-binary-file-using-urllib2/

答案 3 :(得分:1)

以下python代码在2.6.x上运行可靠。输入数据的类型为str。 请注意,接收数据的服务器必须循环读取所有数据 数据大小将被分块。还附加了java代码片段来读取分块数据。

def post(self, url, data):
    self.curl = pycurl.Curl()
    self.response_headers = StringIO.StringIO()
    self.response_body = io.BytesIO()
    self.curl.setopt(pycurl.WRITEFUNCTION, self.response_body.write)
    self.curl.setopt(pycurl.HEADERFUNCTION, self.response_headers.write)
    self.curl.setopt(pycurl.FOLLOWLOCATION, 1)
    self.curl.setopt(pycurl.MAXREDIRS, 5)
    self.curl.setopt(pycurl.TIMEOUT, 60)
    self.curl.setopt(pycurl.ENCODING,"deflate, gzip")
    self.curl.setopt(pycurl.URL, url)
    self.curl.setopt(pycurl.VERBOSE, 1)
    self.curl.setopt(pycurl.POST,1)
    self.curl.setopt(pycurl.POSTFIELDS,data)
    self.curl.setopt(pycurl.HTTPHEADER, [ "Content-Type: octate-stream" ])
    self.curl.setopt(pycurl.POSTFIELDSIZE, len(data))
    self.curl.perform()
    return url, self.curl.getinfo(pycurl.RESPONSE_CODE),self.response_headers.getvalue(), self.response_body.getvalue()

servlet引擎的Java代码:

int postSize = Integer.parseInt(req.getHeader("Content-Length"));
results = new byte[postSize];
int read = 0;
while(read < postSize) {
      int n = req.getInputStream().read(results);
      if (n < 0) break;
      read += n;
  }

答案 4 :(得分:0)

找到了一个适用于cherrypy文件上传示例的解决方案:urllib2-binary-upload.py