当前位置: 首页 > 知识库问答 >
问题:

如何使用python请求上载文件?

公子昂
2023-03-14

我正在执行使用Python请求库上传文件的简单任务。我搜索了Stack Overflow,似乎没有人遇到同样的问题,即服务器无法接收文件:

import requests
url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post'
files={'files': open('file.txt','rb')}
values={'upload_file' : 'file.txt' , 'DB':'photcat' , 'OUT':'csv' , 'SHORT':'short'}
r=requests.post(url,files=files,data=values)

我正在用我的文件名填充upload_file关键字的值,因为如果我把它留空,它会说

Error - You must select a file to upload!

现在我得到了

File  file.txt  of size    bytes is  uploaded successfully!
Query service results:  There were 0 lines.

只有当文件为空时才会显示。所以我一直在思考如何成功地发送文件。我知道这个文件是有效的,因为如果我去这个网站手动填写表单,它会返回一个匹配html" target="_blank">对象的列表,这就是我想要的。我真的很感激所有的提示。

其他一些相关的线程(但没有回答我的问题):

  • 使用POST从Python脚本发送文件
  • http://docs.python-requests.org/en/latest/user/quickstart/#response-content
  • 使用请求上传文件并发送额外的数据
  • http://docs.python-requests.org/en/latest/user/advanced/#body-content-workflow

共有3个答案

林礼骞
2023-03-14

如果要使用Pythonrequestslibrary上载单个文件,那么requests lib支持流式上载,这允许您发送大文件或流而无需读取内存。

with open('massive-body', 'rb') as f:
    requests.post('http://some.url/streamed', data=f)

然后将文件存储在服务器上。py侧,以便将流保存到文件中而不加载到内存中。下面是使用Flask文件上载的示例。

@app.route("/upload", methods=['POST'])
def upload_file():
    from werkzeug.datastructures import FileStorage
    FileStorage(request.stream).save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    return 'OK', 200

或者使用werkzeug表单数据解析,如修复“大文件上传占用内存”问题中提到的,以避免在大文件上传(s. t.22 GiB文件在〜60秒。内存使用量恒定在约13 MiB。)

@app.route("/upload", methods=['POST'])
def upload_file():
    def custom_stream_factory(total_content_length, filename, content_type, content_length=None):
        import tempfile
        tmpfile = tempfile.NamedTemporaryFile('wb+', prefix='flaskapp', suffix='.nc')
        app.logger.info("start receiving file ... filename => " + str(tmpfile.name))
        return tmpfile

    import werkzeug, flask
    stream, form, files = werkzeug.formparser.parse_form_data(flask.request.environ, stream_factory=custom_stream_factory)
    for fil in files.values():
        app.logger.info(" ".join(["saved form name", fil.name, "submitted as", fil.filename, "to temporary file", fil.stream.name]))
        # Do whatever with stored file at `fil.stream.name`
    return 'OK', 200
燕永昌
2023-03-14

(2018)新的python请求库简化了这个过程,我们可以使用“files”变量来表示我们想要上传一个多部分编码的文件

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)
r.text
梁丘高朗
2023-03-14

如果upload\u文件是该文件,请使用:

files = {'upload_file': open('file.txt','rb')}
values = {'DB': 'photcat', 'OUT': 'csv', 'SHORT': 'short'}

r = requests.post(url, files=files, data=values)

并且请求将发送一个包含多个部分的表单POST正文,其中upload_file字段设置为file.txt文件的内容。

文件名将包含在特定字段的mime标头中:

>>> import requests
>>> open('file.txt', 'wb')  # create an empty demo file
<_io.BufferedWriter name='file.txt'>
>>> files = {'upload_file': open('file.txt', 'rb')}
>>> print(requests.Request('POST', 'http://example.com', files=files).prepare().body.decode('ascii'))
--c226ce13d09842658ffbd31e0563c6bd
Content-Disposition: form-data; name="upload_file"; filename="file.txt"


--c226ce13d09842658ffbd31e0563c6bd--

请注意filename="file.txt"参数。

如果需要更多的控制,可以为文件映射值使用一个元组,其中包含2到4个元素。第一个元素是文件名,后面是内容、可选的内容类型标题值和其他标题的可选映射:

files = {'upload_file': ('foobar.txt', open('file.txt','rb'), 'text/x-spam')}

这将设置一个可选的文件名和内容类型,省去可选的标题。

如果您想从一个文件(没有指定其他字段)中获取整个帖子正文,那么不要使用files参数,只需将该文件直接作为数据发布即可。然后,您可能还需要设置内容类型标题,否则不会设置任何标题。请参见Python请求-从文件发布数据。

 类似资料:
  • 我可以使用将文件上载为 上面的代码运行良好。 现在,我想对同一作业使用。我试着在网上搜索并实现代码。但我无法得到结果。 html代码如下所示: 代码中没有任何形式。如何解决问题?

  • 问题内容: 我正在尝试使用的模块从网络下载并保存图像。 这是我使用的(工作)代码: 你能帮助我从响应中使用什么属性吗? 问题答案: 你可以使用对象,也可以遍历响应。 默认情况下,使用类似文件的对象不会解码压缩的响应(使用GZIP或deflate)。你可以通过将属性设置为True(requests将其设置False为控制自身解码)来强制为你解压缩。然后,你可以使用将数据流式传输到文件对象: 要遍历响

  • 我无法访问后端服务器,我通过网络分析了API。我想用那个API上传文件。我观察到,在对该API的post请求中没有参数。我观察到网络中的请求负载。 响应头 缓存控制:无缓存连接:保持活动内容长度:135内容类型:text/html;charset=utf-8日期:2016年8月6日星期六14:32:00 GMT地点:http://myURL服务器:nginx/1.2。3.设置Cookie:_mys

  • 问题内容: 请求是一个非常不错的库。我想用它来下载大文件。问题是不可能将整个文件保留在内存中,我需要分块读取它。这是以下代码的问题 由于某种原因,它无法按这种方式工作。仍将响应加载到内存中,然后再将其保存到文件中。 更新 如果你需要一个小型客户端,可以从FTP下载大文件,则可以在此处找到它。它支持多线程和重新连接(它确实监视连接),还可以为下载任务调整套接字参数。 问题答案: 使用以下流代码,无论

  • 问题内容: 这是我的代码: 这使我可以访问csv文件。我尝试了其他方法来处理下载: 这将给csv文件一个字符串: 这将打印第一行并返回错误:_csv.Error:在未引用的字段中看到换行符 这将在每行中打印一个字母,并且不会打印出整个内容: 我的问题是:在这种情况下读取CSV文件的最有效方法是什么。以及如何下载。 谢谢 问题答案: 这应该有助于: 输出样本: 答案相关的问题: 使用此功能将csv加

  • 问题内容: 我正在使用Python请求库从网络获取PDF文件。这可以正常工作,但我现在也想要原始文件名。如果我在Firefox中转到PDF文件,然后单击它,则已经定义了文件名来保存pdf。如何获得此文件名? 例如: 我检查了是否有任何有趣的内容,但其中没有文件名。我实际上希望的是.. 有人知道如何通过请求库获取下载的PDF文件的文件名吗? 问题答案: 它在http标头中指定。因此,要提取名称,您将