- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 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/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!