Python – HTTP multipart / form-data POST请求

前端之家收集整理的这篇文章主要介绍了Python – HTTP multipart / form-data POST请求前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想将文件上传到Web服务器.根据我的阅读,最好的方法是在HTTP POST请求中使用multipart / form-data编码类型.

我的研究似乎表明,使用Python标准库没有简单的方法可以做到这一点.我正在使用Python 3.

(注意:看一个名为requests(PyPI Link)的软件包可以轻松完成此操作)

我目前正在使用这种方法

  1. @H_301_12@import mimetypes,http.client
  2. boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T' # Randomly generated
  3. for fileName in fileList:
  4. # Add boundary and header
  5. dataList.append('--' + boundary)
  6. dataList.append('Content-Disposition: form-data; name={0}; filename={0}'.format(fileName))
  7.  
  8. fileType = mimetypes.guess_type(fileName)[0] or 'application/octet-stream'
  9. dataList.append('Content-Type: {}'.format(fileType))
  10. dataList.append('')
  11.  
  12. with open(fileName) as f:
  13. # Bad for large files
  14. dataList.append(f.read())
  15.  
  16. dataList.append('--'+boundary+'--')
  17. dataList.append('')
  18. contentType = 'multipart/form-data; boundary={}'.format(boundary)
  19.  
  20. body = '\r\n'.join(dataList)
  21. headers = {'Content-type': contentType}
  22.  
  23. conn = http.client.HTTPConnection('http://...')
  24. req = conn.request('POST','/test/',body,headers)
  25.  
  26. print(conn.getresponse().read())

这适用于发送文本.

有两个问题:这只是文本,整个文本文件必须作为一个巨大的字符串存储在内存中.

如何上传任何二进制文件?有没有办法在不将整个文件读入内存的情况下执行此操作?

最佳答案
我看了一下这个模块

  1. @H_301_12@class HTTPConnection:
  2. # ...
  3. def send(self,data): # line 820
  4. """Send `data' to the server.
  5. ``data`` can be a string object,a bytes object,an array object,a
  6. file-like object that supports a .read() method,or an iterable object.
  7. """

数据完全是正文.
你可以通过这样的迭代器:(我没试过)

  1. @H_301_12@def body():
  2. for fileName in fileList:
  3. # Add boundary and header
  4. yield('--' + boundary) + '\r\n'
  5. yield('Content-Disposition: form-data; name={0}; filename= {0}'.format(fileName)) + '\r\n'
  6.  
  7. fileType = mimetypes.guess_type(fileName)[0] or 'application/octet-stream'
  8. yield('Content-Type: {}'.format(fileType)) + '\r\n'
  9. yield('\r\n')
  10.  
  11. with open(fileName) as f:
  12. # Bad for large files
  13. yield f.read()
  14. yield('--'+boundary+'--') + '\r\n'
  15. yield('') + '\r\n'

猜你在找的Python相关文章