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