Python requests上传文件与参数结合实战

版权申诉
13 下载量 195 浏览量 更新于2024-09-14 1 收藏 74KB PDF 举报
"Python requests库用于上传文件的实现方法,主要涉及HTTP POST请求以及multipart/form-data格式。在实际工作中,接口要求提供md5加密、文件大小和文件内容等字段。官方文档提供了基本的文件上传示例,但未涵盖带有额外参数的情况。在处理这种需求时,需要同时使用requests的data和files参数,将文件和其他非文件参数分开处理,合并成multipart数据进行发送。" 在Python中,`requests`库是一个非常强大的HTTP客户端,常用于发送网络请求。在本例中,我们需要实现上传文件到特定接口的功能。接口规定了上传文件的格式为`multipart/form-data`,并且需要提供三个字段:md5值、文件大小和文件内容。 首先,我们需要了解`multipart/form-data`是一种HTTP请求体的数据格式,常用于POST请求,特别是上传文件时。它将不同的数据部分分割,并且每个部分都有自己的边界,这样服务器就能解析并识别出各个字段。 官方文档中提供的例子展示了如何简单地上传文件: ```python url = 'https://httpbin.org/post' files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} response = requests.post(url, files=files) ``` 然而,当需要传递额外的非文件参数时,如md5和filesize,我们可以使用`data`参数。这样,`requests`库会自动将`data`和`files`中的内容合并为一个完整的`multipart/form-data`请求体。 下面是一个结合额外参数的完整实现示例: ```python import requests import time import hashlib # 假设已有的函数,用于获取文件信息 def get_file_info(file_name): with open(file_name, 'rb') as f: content = f.read() md5_value = hashlib.md5(f'{0}_{int(time.time())}'.encode()).hexdigest() # 计算md5值 file_size = len(content) return content, md5_value, file_size # 文件名 file_name = 'example.txt' # 获取文件信息 file_content, md5_value, file_size = get_file_info(file_name) # 构建请求数据 request_data = { 'md5': md5_value, 'filesize': str(file_size), } # 使用requests发送POST请求 url = 'http://test.com/flow/upload' files = {'file': (file_name, file_content, 'text/plain')} # 假设文件类型为文本 response = requests.post(url, data=request_data, files=files) # 处理响应 if response.json().get('success'): upload_name = response.json()['uploadName'] upload_path = response.json()['uploadPath'] print(f'文件上传成功,保存名为:{upload_name},路径为:{upload_path}') else: print('文件上传失败') ``` 在这个示例中,我们首先读取文件内容并计算其md5值和大小。然后,我们创建一个字典`request_data`来存储这些额外的参数。在`files`字典中,我们包含文件名、文件内容和一个假定的MIME类型(在这里是'text/plain')。最后,通过`requests.post()`函数发送POST请求,将`data`和`files`一并传递。根据服务器返回的响应,我们可以判断文件是否上传成功,并获取上传后的文件名和路径。