code: def encode_multipart(data, files):
      body = BytesIO()
      boundary = choose_boundary()
      part_boundary = b('--%s\r\n' % boundary)
      writer = codecs.lookup('utf-8')[3]
      if isinstance(data, dict):
          for name, values in data.items():
              if not isinstance(values, (list, tuple, set)):
                  values = (values, )
              for value in values:
                  body.write(part_boundary)
                  writer(body).write('Content-Disposition: form-data; '
                                     'name="%s"\r\n' % name)
                  body.write(b'Content-Type: text/plain\r\n\r\n')
                  if isinstance(value, int):
                      value = str(value)
                  if py3k and isinstance(value, str):
                      writer(body).write(value)
                  else:
                      body.write(value)
                  body.write(b'\r\n')
      for fieldname, f in files.items():
          if isinstance(f, tuple):
              filename, f = f
          elif hasattr(f, 'name'):
              filename = basename(f.name)
          else:
              filename = None
              raise UrlfetchException("file must has filename")
          if hasattr(f, 'read'):
              value = f.read()
          elif isinstance(f, basestring):
              value = f
          else:
              value = str(f)
          body.write(part_boundary)
          if filename:
              writer(body).write('Content-Disposition: form-data; name="%s"; '
                                 'filename="%s"\r\n' % (fieldname, filename))
              body.write(b'Content-Type: application/octet-stream\r\n\r\n')
          else:
              writer(body).write('Content-Disposition: form-data; name="%s"'
                                 '\r\n' % name)
              body.write(b'Content-Type: text/plain\r\n\r\n')
          if py3k and isinstance(value, str):
              writer(body).write(value)
          else:
              body.write(value)
          body.write(b'\r\n')
      body.write(b('--' + boundary + '--\r\n'))
      content_type = 'multipart/form-data; boundary=%s' % boundary
      return content_type, body.getvalue()