http - TidHTTPServer "Out of memory"大文件上传

标签 http delphi indy idhttp

我正在使用 Delphi 10.3.1 和 Indy TIdHTTP/TIdHTTPServer

我创建了一个客户端/服务器应用程序来归档文件。 客户端使用了一个TIdHTTP组件,代码是这样的:

procedure TForm1.SendFileClick (Sender: TObject);
var
    Stream: TIdMultipartFormDataStream;
begin
    Stream: = TIdMultipartFormDataStream.Create;
    try
       Stream.AddFormField ('field1', 'hello world');
       Stream.AddFile ('field2', 'c:\temp\gigafile.mp4');
       idHTTP.Post ('http://192.168.1.100:1717', Stream);
    finally
       Stream.Free;
    end;
end;

服务器使用 TIdHTTPServer 组件。 在我上传非常大的视频文件(>= 1GB)之前,一切似乎都运行良好,因为我收到错误“内存不足”。

通过调试,我看到我在 PreparePostStream 函数(IdCustomHTTPServer 单元的第 1229 行)调用 LIOHandler.ReadStream 时出错,事件 OnCommandGet 尚未触发。

函数LIOHandler.ReadStream运行AdjustStreamSize时出错(IdIOHandler单元2013行)

在我上次的测试中,有一个大的视频文件,在 AdjustStreamSize 函数中,ASize 的值为 1091918544,我在执行过程中得到了错误

AStream.Size line: = ASize

我认为错误的起源点在以下过程中的 System.Classes 单元中,当在 SetPointer ... 行时。

procedure TMemoryStream.SetCapacity (NewCapacity: NativeInt);
{$ IF SizeOf (LongInt) = SizeOf (NativeInt)}
begin
  SetPointer (Realloc (LongInt (NewCapacity)), FSize);
  FCapacity: = NewCapacity;
end;

我在网上看了很多文章,但我不明白我的代码是否有问题。 我该如何解决它,或者我可以使用 TIdHTTPServer 上传的文件大小是否有限制?

最佳答案

默认情况下,TIdHTTPServer 使用 TMemoryStream 接收发布的数据,这显然不适用于如此大的文件。您可以使用服务器的 OnCreatePostStream 事件提供一个替代的 TStream 对象来接收,例如 TFileStream

关于http - TidHTTPServer "Out of memory"大文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56477826/

相关文章:

http - ActiveMQ 5.2.0 + REST + HTTP POST = java.lang.OutOfMemoryError

ajax - 使用 GET 请求比使用 POST 请求有什么优势?

delphi - 在 ZipForge 中手动创建事件处理程序

delphi - 用于在Intraweb VCL中使https工作的pem文件对于Web

delphi - Http 客户端获取请求

java - 通过 http 寻找 api/协议(protocol)

java - http get 返回 403

delphi - 有没有办法禁止在备忘录控件中选择文本?

c++ - 将一行 delphi 代码转换为 c++

delphi - WSAASyncSelect足够好吗?你能建议一个替代方案吗?印地更好吗?