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

如何使用请求[duplicate]下载二进制文件

梅修贤
2023-03-14

我试图下载一个二进制文件,并将其原始名称保存在磁盘上(linux)。

有什么想法吗?

import requests

params = {'apikey': 'xxxxxxxxxxxxxxxxxxx', 'hash':'xxxxxxxxxxxxxxxxxxxxxxxxx'}
response = requests.get('https://www.test.com/api/file/download', params=params)
downloaded_file = response.content

if response.status_code == 200:
    with open('/tmp/', 'wb') as f:
        f.write(response.content)

共有1个答案

邵星光
2023-03-14

从您在评论中的澄清来看,您的问题是您希望保留文件的原始名称。

如果URL指向原始二进制数据,则URL的最后一部分将是其“原始名称”,因此您可以通过如下解析URL来获得该名称:

local_filename = url.split('/')[-1]

为了将其付诸实践,并考虑到问题的上下文,下面是代码,它完全符合您的需要,从另一个SO问题中复制过来:

local_filename = url.split('/')[-1]
# NOTE the stream=True parameter
r = requests.get(url, stream=True)
with open(local_filename, 'wb') as f:
    for chunk in r.iter_content(chunk_size=1024): 
        if chunk: # filter out keep-alive new chunks
            f.write(chunk)
            #f.flush() commented by recommendation from J.F.Sebastian
return local_filename

我不能把这个作为评论发布,所以不得不把它放在回答中。我希望我已经说得够清楚了。告诉我你对代码有什么问题。当问题解决后,也请通知我,这样我就可以删除它,因为它已经得到了回答。

编辑

下面是代码的一个版本:

import requests

url = 'https://www.test.com/api/file/download'
params = {'apikey': 'xxxxxxxxxxxxxxxxxxx', 'hash':'xxxxxxxxxxxxxxxxxxxxxxxxx', 'stream':True}
response = requests.get(url, params=params)

local_filename = url.split('/')[-1]
totalbits = 0
if response.status_code == 200:
    with open(local_filename, 'wb') as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                totalbits += 1024
                print("Downloaded",totalbits*1025,"KB...")
                f.write(chunk)

注意:如果不想让它显示进度,只需删除第15行的print语句即可。已使用以下url对此进行了测试:https://imagecomics.com/uploads/releases/_small/DeadRabbit-02_cvr.jpg它似乎工作得很好。同样,如果您有任何问题,请在下面进行评论。

 类似资料:
  • 问题内容: 使用带有角的ResponseEntity下载任何文件不起作用 我需要在客户端使用angular下载文件,该文件可以具有pdf或excel或image或txt的任何格式…我的方法仅适用于txt文件,但给我excel和image的失败格式,对于pdf,它会给出一个空的pdf。 所以在我的控制器中,这里是调用service方法的函数: 而我的service.js具有: 我的服务方法是这样的:

  • 问题内容: 我正在尝试使用jQuery AJAX下载二进制音频文件。 通常我只会发出这样的命令: 但是,最近我们的服务器等待时间太长,无法响应,并且我收到了令人讨厌的网关超时消息。 有人建议我改用jQuery AJAX,从那时起我就可以更好地控制超时了。 这是到目前为止我玩过的代码: 当我省略“ dataType”时,二进制文件的传输量大约是服务器上实际文件传输量的三倍。但是,当我使dataTyp

  • 问题内容: 我正在尝试使用以下方法下载此文件(http://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar),但似乎无法正常工作。我收到一个空文件/损坏的文件。 但是我可以使用相同的方法从我的保管箱(http://dl.dropbox.com/u/13226123/ChampionHelper-4.jar

  • 问题内容: 我想在单击按钮时发送“ ajax下载请求”,所以我尝试了这种方式: javascript: download.php: 但是没有按预期工作,我该怎么办?先感谢您 问题答案: 2015年4月27日更新 进入HTML5场景的是download属性。它支持在Firefox和Chrome,并很快来到IE11。根据您的需求,只要您要下载的文件与您的网站位于同一来源,就可以使用它代替AJAX请求(

  • 我在android应用程序中使用OKHTTP客户端进行网络连接。 接受下面的回答。我修改过的代码:

  • 我试图下载和保存图像从网络使用python的模块。 以下是我使用的(工作)代码: 以下是使用