requests上传文件

发布时间 2023-09-01 20:20:16作者: 贝壳里的星海

requests上传文件

requests库中的files参数可以用来上传文件,它是一个字典类型的变量,其中键是文件的字段名,值可以是以下几种类型之一:

  • 字符串类型:表示文件路径,会自动打开文件并上传

  • 文件对象:可以通过 open() 函数获取

  • 元组类型:第一个元素是文件名,第二个元素是文件对象

  • 或者files是一个List[Dict] 一个嵌套列表

单文件上传

下面是一个使用files参数上传单个文件的例子

import requests

url = 'http://example.com/upload'
files = {'file': open('example.txt', 'rb')}
headers = {'content-type': 'multipart/form-data'}
response = requests.post(url, files=files, headers=headers)

多文件上传

如果要上传多个文件,可以在files参数中添加多个键值对,如下所示:

import requests

url = 'http://example.com/upload'
files = {'file1': open('example1.txt', 'rb'), 
         'file2': open('example2.txt', 'rb'),
         'file3': open('example3.txt', 'rb')
        }
response = requests.post(url, files=files)


# 或者采用LIST
import requests

url = 'http://example.com/upload'
files = [
    ('file1', ('example1.txt', open('example1.txt', 'rb'))),
    ('file2', ('example2.txt', open('example2.txt', 'rb'))),
    ('file3', ('example3.txt', open('example3.txt', 'rb')))
]
response = requests.post(url, files=files)

指定文件和类型

如果上传的文件是二进制文件,需要以二进制模式打开文件(即添加'rb'参数)。另外,如果上传的文件是图片或者其他媒体类型,可以在请求头中添加Content-Type字段来指定文件类型,例如:

import requests

url = 'http://example.com/upload'
headers = {'Content-Type': 'image/jpeg'}
files = {'file': ('example.jpg', open('example.jpg', 'rb'), 'image/jpeg')}
response = requests.post(url, headers=headers, files=files)

上面的例子中,将文件类型设置为image/jpeg,并且在文件元组中指定了文件名和文件类型

既要上传文件又要上传参数

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)
 

文件接收

可以使用Flask的request对象来接收上传的文件。以下是一个示例,假设上传的文件字段名为file

from flask import Flask, request

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_file():
    file = request.files['file']
    # 保存文件到本地
    
    file.save('uploaded_file.txt')
    return 'File uploaded successfully'

if __name__ == '__main__':
    app.run()

在上面的代码中,我们使用request.files字典来获取上传的文件,然后使用save()方法将文件保存到本地。注意,save()方法需要指定保存的文件路径和文件名。如果上传的文件是二进制文件,可以使用stream=True参数来获取文件的二进制内容,例如:

from flask import Flask, request

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_file():
    file = request.files['file']
    # 获取二进制内容并保存到本地
    with open('uploaded_file.bin', 'wb') as f:
        f.write(file.stream.read())
    return 'File uploaded successfully'

if __name__ == '__main__':
    app.run()
    

参考资料