【问题标题】:Upload a file's content in Python在 Python 中上传文件的内容
【发布时间】:2015-08-06 16:23:23
【问题描述】:

我想使用没有任何不在标准库中的模块的 Python 2.7 将文件上传到 Web 服务器(它将接受此类请求)。 我知道这可以通过将数据作为多部分表单数据的一部分上传来完成,但是我想知道我是否可以将POSTContent-Type: application/pdf(例如)和Content-Length 设置为文件的长度并且,帖子的内容只是(在本例中为 PDF)文件的内容。 如果是这样,最简单的方法是什么?

【问题讨论】:

  • 我想知道我是否可以使用 Content-Type: application/pdf 进行 POST 这取决于 web 服务器 是否接受.如果服务器只接受 multipart/form-data 用于文件上传,则不能强制服务器接受其他内容。
  • 首先确定服务器是否接受没有多部分负载的直接帖子。您可以使用 Postman(Chrome 扩展程序)或 Python requests 库,甚至使用标准库中的 urllib2。如果你真的必须的话,那就把自己限制在标准库中。
  • 直接上传是完全可能的。只需将urllib2.Request() data parameter 设置为您的文件内容(以二进制形式打开),然后设置Content-Type 标头。完成。
  • @Martijn Pieters 将 data 参数传递给 urllib2.Request 根据文档仅接受 application/x-www-form-urlencoded 中的数据(至少在 Python 2.7 中)。服务器将接受此类请求。
  • 不,Request 对象实际上并不关心。文档只是告诉您数据不会为您编码,您需要提供易于编码的数据如果您使用的是表单发布

标签: python upload http-post standard-library


【解决方案1】:

如果服务器将接受直接有效负载发布(而不是将文件作为multipart/form-data POST 请求的一部分),您只需将Request() 数据参数设置为文件数据:

import urllib2

with open(filename, 'rb') as uploadfile:
    request = urllib2.Request(url, data=uploadfile.read(),
                              {'Content-Type': 'application/pdf'})

response = urllib2.urlopen(request)

urllib2.Request 对象不对data 的内容做任何假设,除非您自己提供Content-Type 标头,如果设置了data,则该标头将设置为application/x-www-form-urlencoded

当您执行此操作时,将为您设置 Content-Length 标头。

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多