Python培训
400-996-5531
废话不多说啦, 三个点:
Header
里面设置 Content-Type
;
Header
里面设置 Content-Length
;
把文件内容读出来, 按格式要求写到 Body 里面.
因为我们是通过 Post Form 的形式上传文件, 所以 Content-Type
是: multipart/form-data
.
1# boundary 是用来分割 body 中各 field 的内容的, 推荐使用标准库来自动生成 2boundary = mimetools.choose_boundary() 3content_type = 'multipart/form-data; boundary=%s' % boundary
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 只有 name
和 value
.
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_type
和 file_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 就是 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)
填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved