gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:35:36 34 4
gpt4 key购买 nike

我正在使用 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com