更多课程 选择中心


Python培训

400-996-5531

使用 Python 标准库上传文件

  • 发布: 胡伟强
  • 来源: 胡伟强
  • 时间:2018-03-01 15:05

废话不多说啦, 三个点:

  1. Header 里面设置 Content-Type;

  2. Header 里面设置 Content-Length;

  3. 把文件内容读出来, 按格式要求写到 Body 里面.  

一. Content-Type

因为我们是通过 Post Form 的形式上传文件, 所以 Content-Type 是:  multipart/form-data.

1# boundary 是用来分割 body 中各 field 的内容的, 推荐使用标准库来自动生成 2boundary = mimetools.choose_boundary() 3content_type = 'multipart/form-data; boundary=%s' % boundary 

二. Body 格式

Content-Length 很简单, 只要构建好了 Body, Length 就是 len(Body)
怎么构建 Post 的 Body 部分呢?先创建一个 binary 对象: binary = io.BytesIO() 然后再往里面写东西就好啦. 不过写的时候注意按以下格式:

2.1 先创建一个分割线

1part_boundary = '--' + boundary   2# 就是 Header 里面指定的 `boundary`, 把它前面再加两个减号.  

2.2 构建 Form 表单每一个常规 Field  
常规 Field 只有 namevalue.

 1regular_blocks = []  2for name, value in regular_fields.items():  3    block = [part_boundary,  4            'Content-Disposition: form-data; name="%s"' % name,  5            '',  6            value  7            ]  8    block = '\r\n'.join(block)  9    block = codecs.encode(block) 10    regular_blocks.append(block) 11regular_blocks = '\r\n'.join(regular_blocks) 

2.3  构建 Form 表单每一个文件 Field  
文件 Field 有 field_name, file_name, file_typefile_data.

 1# 先搞到文件类型  2file_type = mimetypes.guess_type(filename)[0] or 'application/octet-stream'  3# 再搞到文件内容  4with codecs.open(file_path, 'rb') as f:  5    file_data = f.read()  6...  7# 然后是写入文件 block  8file_blocks = []  9for field_name, file_name, file_type, file_data in file_fields: 10    block = [part_boundary, 11             # 注意这里, 相对于常规 field, 文件 field 多了一个 filename 12             'Content-Disposition: form-data; name="%s"; filename="%s"' % (field_name, file_name), 13             # 注意这里, 相对于常规 field, 文件 field 多了一个 Content-Type 14             'Content-Type: %s' % file_type, 15             '', 16             file_data 17             ] 18    block = '\r\n'.join(block) 19    file_blocks.append(block) 20file_blocks = '\r\n'.join(file_blocks) 

2.4 把这些 blocks 写入 binary

1all_field_blocks = '\r\n'.join(regular_blocks, file_blocks) 2binary.write(all_field_blocks) 3binary.write('\r\n--' + boundary + '--\r\n') 

2.5 得到 Body

1body = str(binary.getvalue()) 

三. Content-Length

Content-Length 就是 len(body)

四. 发送数据

 1from urllib2 import Request  2from urllib2 import urlopen  3from urllib2 import HTTPError  4...   5# 假设你已经按照格式得到了 body  6headers = {'Content-Length': len(body)),  7           'Content-Type': `multipart/form-data; boundary=%s` % mimetools.choose_boundary()}  8upload_req = Request(url=upload_url, data=body, headers=headers)  9upload_rep = urlopen(upload_req).read() 10print(upload_rep)

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Python3 开发轻量级爬虫教程
下一篇:如何使用Python快速制作可视化报表

Python IDE推荐7个你可能会错过的Python IDE

Python面试题之Python中爬虫框架或模块的区别

2021年Python面试题及答案汇总详解

python数据分析,你需要这些工具

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省