首页 > 其他分享 >使用requests库进行文件上传的多种方法。

使用requests库进行文件上传的多种方法。

时间:2023-04-03 14:24:58浏览次数:35  
标签:files 文件 data headers file path requests 上传

一、 仅上传文件

import requests

url = 'http://example.com/upload_file'
file_path = '/path/to/file'

with open(file_path, 'rb') as f:
    files = {'file': f}
    headers = {'content-type': 'multipart/form-data'}
    response = requests.request('POST', url, files=files, headers=headers)

print(response.text)


#如果您需要上传多个文件,可以将它们保存在一个列表中,并将列表作为值传递给 files # 字典中的 'file' 键。例如:

import requests

url = 'http://example.com/upload_files'
file_paths = ['/path/to/file1', '/path/to/file2', '/path/to/file3']

files = {}
for i, file_path in enumerate(file_paths):
    with open(file_path, 'rb') as f:
        files[f'file{i}'] = f

headers = {'content-type': 'multipart/form-data'}
response = requests.request('POST', url, files=files, headers=headers)

print(response.text)

  

二、 既要上传文件,又要上传参数

1) requets.request()方法中使用files参数

import requests

url = 'http://example.com/upload_file'
file_path = '/path/to/file'
data = {'name': 'John', 'age': 30}

with open(file_path, 'rb') as f:
    files = {'file': f}
    headers = {'content-type': 'multipart/form-data'}
    response = requests.request('POST', url, files=files, data=data, headers=headers)

print(response.text)


#如果您需要上传多个文件,可以将它们保存在一个列表中,并将列表作为值传递给 files 字典中的 'file' 键。例如:
import requests

url = 'http://example.com/upload_files'
file_paths = ['/path/to/file1', '/path/to/file2', '/path/to/file3']
data = {'name': 'John', 'age': 30}

files = {}
for i, file_path in enumerate(file_paths):
    with open(file_path, 'rb') as f:
        files[f'file{i}'] = f

headers = {'content-type': 'multipart/form-data'}
response = requests.request('POST', url, files=files, data=data, headers=headers)

print(response.text)

  

1) requets.request()方法中使用data参数, 不用files参数

"""如果您想在使用 requests 库上传文件和传递参数时,不使用 `files` 参数而是使用`data` 参数,可以使用 `MultipartEncoder` 类。`MultipartEncoder` 类可以将文件和
参数打包成 `multipart/form-data` 格式的请求体,并将其传递给 requests 库的 `data` 参数。"""

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

url = 'http://example.com/upload_file'
file_path = '/path/to/file'
data = {'name': 'John', 'age': 30}

with open(file_path, 'rb') as f:
    encoder = MultipartEncoder(fields={'file': ('filename', f), **data})
    headers = {'Content-Type': encoder.content_type}
    response = requests.post(url, data=encoder, headers=headers)

print(response.text)
"""
在上面的代码中,我们指定了要上传的文件的路径(file_path)和上传的 URL(url),并指定了要传递的参数(data)。然后,我们使用 Python 的 with 
语句打开文件,将其读取为二进制数据,并将其作为值传递给名为 `fields` 的字典中的 'file' 键。我们使用 `**data` 将参数字典中的所有键值对解包到 `fields`
字典中。接着,我们使用 `MultipartEncoder` 类将 `fields` 字典打包成 `multipart/form-data` 格式的请求体,并将其传递给请求的 `data` 参数。
最后,我们指定请求头中的 `Content-Type` 为 `encoder.content_type`,以确保请求体以 `multipart/form-data` 格式上传。我们使用 `requests.post`
方法将请求发送到指定的 URL。请注意,这种方法需要使用 `requests_toolbelt` 库中的 `MultipartEncoder` 类。如果您没有安装这个库,
可以通过 `pip install requests-toolbelt` 命令进行安装。另外,这种方法不支持上传多个文件,如果您需要上传多个文件,建议使用前面示例中的方法。"""

  

3) 两者的区别

使用 `files` 参数的方法:

优点:

  - 简单易用,可以方便地上传单个或多个文件。
  - `requests` 库会自动将文件打包成 `multipart/form-data` 格式的请求体,无需手动设置请求头。

缺点:

  - 由于 `requests` 库会自动将文件打包成 `multipart/form-data` 格式的请求体,因此可能会占用更多的内存。
  - 对于大文件或多个文件的上传,可能会导致上传速度变慢或内存不足的情况。

不使用 `files` 参数的方法:

优点:

  - 可以使用 `MultipartEncoder` 类将文件和参数打包成 `multipart/form-data` 格式的请求体,更加灵活。
  - 可以手动设置请求头,更加精细地控制请求。

缺点:

  - 相对来说比较复杂,需要使用 `MultipartEncoder` 类进行打包。
  - 需要手动设置请求头,容易出错。

综上所述,使用 `files` 参数的方法相对来说更加简单易用,适用于上传单个或少量文件的情况;而不使用 `files` 参数的方法相对来说更加灵活,适用于上传大文件或多个文件的情况。具体使用哪种方法,可以根据实际情况进行选择。

 

标签:files,文件,data,headers,file,path,requests,上传
From: https://www.cnblogs.com/lintest/p/17282908.html

相关文章

  • SpringCloud大文件上传解决方案支持分片断点上传
    ​IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传......
  • SpringMVC大文件上传解决方案支持分片断点上传
    ​ 以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传  可以带参数        [HttpPost("upload")]        publicJsonResultuploadProject(I......
  • XmlTextReader正由另一进程使用,因此该进程无法访问此文件
    此处调用报错:publicvoidsetMaxValueByXml(stringJym,stringvalueMax){XmlDocumentxmlDoc=newXmlDocument();xmlDoc.Load(Server.MapPath("XMLData.xml"));XmlNodeListnodeList=xmlDoc.SelectSingleNode("body")......
  • Python 调用Matplotlib 读取txt、csv文件画图
    目录PythonMatplotlib读取txt、csv文件绘图使用方法PythonMatplotlib读取txt、csv文件绘图show_data.pyimportsysimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False#用来......
  • Mybatis配置文件解析(转载)
    流程图demo案例还是从案例开始。publicstaticvoidmain(String[]args){Stringresource="mybatis-config.xml";InputStreaminputStream=null;SqlSessionsqlSession=null;try{inputStream=Resources.getResourceAsStream(resourc......
  • Linux|--sh脚本|--文件执行报错::Error response from daemon: invalid reference for
    前言由于Linux中的docker镜像和容器需要批量处理,所以搞一个脚本,直接一下处理了,1.我在Windows10的本机电脑上新建了一个"test.sh"文件2.将"test.sh"文件上传到Linux环境中3.在Linux中执行"shtest.sh"4.报错了...第一次报错信息[root@VM-4-3-centostest_api]#shdock......
  • nginx上传文件超出默认大小限制-附件,提示:413 Request Entity Too Large
    Nginx限制文件上传大小,相应配置参数:client_max_body_size注意:该参数在nginx.conf中默认是没有配置的,不配置的情况下,nginx默认限制请求附件大小为:1M。即:默认当你通过nginx代理上传附件,大于1M的文件时,浏览器会抛出如下异常。处理方式:找到nginx的配置文件nginx/conf/nginx.conf,......
  • Python配置文件管理之ini和yaml文件读取
    当我们设计软件时,我们通常会花费大量精力来编写高质量的代码。但这往往还不够,一个好的软件还应该考虑其整个系统,如测试、部署、网络等。其中最重要的一个方面是配置管理。良好的配置管理应允许在任何环境中执行软件而不更改代码。最常见的配置包括数据库认证配置、部署服务器的主......
  • 若分离HTML与CSS,要记得连接外部CSS文件
    使用下列代码即可连接,注意CSS文件名和HTML文件名相同:<linkrel="stylesheet"type="text/css"href="文件名.css">  应放在代码头,如下所示:<!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  &......
  • ubuntu下配置supervisor 运行golang打包后的可执行文件
    aptupdateaptinstallsupervisorvim/etc/supervisor/supervisord.conf添加如下配置:command配置成可执行文件的路径,directory为文件所在目录[program:tempupService]command=/data/goServicedirectory=/dataautostart=trueautorestart=truestartsecs=10stdout_lo......