当前位置: 首页 > 面试题库 >

通过Python中的HTTP从客户端到服务器流未知大小的数据

熊烨
2023-03-14
问题内容

不幸的是,我先前的问题由于是问题的“精确副本”而被关闭,而它肯定不是,特此再次。

它不是Python的副本:HTTP通过流发布大文件

那就是处理大文件流;我想将文件的任意块一一发送到相同的http连接。所以我有一个20 MB的文件,我想要做的是打开一个HTTP连接,然后发送1
MB,再发送1 MB,依此类推,直到完成。使用相同的连接,因此服务器看到该连接上出现了20 MB的块。

我也打算映射文件,但是当从标准输入中读取数据时,这是行不通的。主要针对第二种情况,我正在寻找这种分部分的数据馈送。

老实说,我想知道是否可以全部解决-如果我想知道,如果不能,那么可以解决这个问题。但是,如果可以做到,那怎么办呢?


问题答案:

从客户的角度来看,这很容易。您可以使用httplib的低级别的界面-
putrequestputheaderendheaderssend任何你想在任何大小的块服务器-
to发送。

但是,您还需要指出文件的结束位置。

如果您事先知道文件的总大小,则只需添加Content-Length标头,服务器将在读完这么多字节后停止读取您的请求正文。代码可能看起来像这样。

import httplib
import os.path

total_size = os.path.getsize('/path/to/file')
infile = open('/path/to/file')
conn = httplib.HTTPConnection('example.org')
conn.connect()
conn.putrequest('POST', '/upload/')
conn.putheader('Content-Type', 'application/octet-stream')
conn.putheader('Content-Length', str(total_size))
conn.endheaders()
while True:
    chunk = infile.read(1024)
    if not chunk:
        break
    conn.send(chunk)
resp = conn.getresponse()

如果您事先不知道总大小,则理论上的答案是分块传输编码。问题是,尽管它广泛用于响应,但似乎对请求的要求不高(尽管定义明确)。库存的HTTP服务器可能无法立即使用它。但是,如果服务器也处于您的控制之下,则可以尝试从请求正文中手动解析这些块,然后将它们重新组装到原始文件中。

另一种选择是Content- Length通过同一连接将每个块作为单独的请求(带有)发送。但是您仍然需要在服务器上实现自定义逻辑。此外,您需要在请求之间保持状态。

新增2012-12-27。
有一个nginx模块,可将分块的请求转换为常规请求。只要您不需要真正的流式传输(在客户端完成发送请求之前开始处理请求),它可能会有所帮助。



 类似资料:
  • 问:在支持服务器的java应用程序中,是否可以在Spring使用websocket将数据从服务器发送到客户端,而不创建另一个客户端? 互联网上几乎所有关于spring中websocket的文章都展示了如何在控制器中定义方法来处理请求。当他们用两个注解@MessageMapping("/news ")、@SendTo("/topic/news ")定义一个函数时,所有的神奇似乎都发生了。单凭这个方法

  • 我有两个AWS EC2实例。服务器和客户端节点JS应用程序。 在本地,我的代码运行良好。但是在AWS,客户端会在一段时间后(例如30秒)关闭,没有任何警告/异常(由于某种原因,它无法找到并连接到服务器) 两个AWS实例都在运行:Windows Server 2016 Base。 两个AWS实例都有自己的服务器“AWS安全组”。只是为了确保我没有阻止两个安全组当前允许的任何东西:“所有流量到任何IP

  • 问题内容: 首先,我将请求的文件从服务器发送到客户端,然后再将文件的计算出的sha从服务器发送到客户端,以便客户端可以检查发送文件和接收文件中的sha是相同的。 我设法发送了文件,但是当我尝试也发送sha(这是一个变量)时,我收到一个错误消息(我相信sha也已添加到文件内容中) 如何分别发送? 和客户: 问题答案: 您应该重新设计应用程序的工作方式: 首先,服务器将文件大小发送给客户端 客户端读取

  • 这是我认为我应该用于这种方法的布局:并且为了适应404路由,还可以使用。现在,如果我的Akka流知识对我有用的话,我需要使用来处理这样的事情,然而,这就是我被困住的地方。 在中,我可以为不同的endpoint进行简单的映射和flatMap,但在流中,这意味着将流划分为多个流,我不太确定该如何进行。我想过使用UnzipWith和Options或通用广播。 如能在这方面提供任何帮助,将不胜感激。 如果

  • 我正在开发一个使用Python编写的REST API的Xamarin应用程序。 Xamarin应用程序提供了虚拟购物清单,用户可以在其中协作购买共享清单上的物品。 为了改善用户体验,我希望能够主动通知用户关于列表中的已完成项目。 通知由API存储在关系数据库中,并有一个标志指示用户是否已经收到通知。 API有一个endpoint,它向数据库查询通知并返回带有这些通知的JSON响应。 实现起来相当简

  • 问题内容: 由于我是Web服务的新手,请您告诉我问题的答案。我的问题是 我想实现一个Web服务,当客户端调用此Web服务时,该服务会向客户端发送pdf文件。 请有人帮我提供一段不错的代码或解释。 现在可以请一个人解决我的错误。 12-23 09:42:48.429:调试/安装(32):DexInv:-开始’/data/app/vmdl33143.tmp’— 12-23 09:42:51.708:调

  • 创建 HTTP 客户端 使用默认选项创建一个HttpClient实例,如下所示: HttpClient client = vertx.createHttpClient(); 如果您想要在创建时配置客户端的选项,如下所示: HttpClientOptions options = new HttpClientOptions().setKeepAlive(false); HttpClient clien