用浏览器POST上传一个大于4G的文件到HTTP服务器上没有任何问题。 现在用Delphi的TNetHttpClient上传大文件报错,文件大于2G,报错:Out of memory 代码如下: procedure TfrmMain.Button1Click(Sender: TObject); var cHttp: TNetHTTPClient; vData: TMultipartFormData; vRsp: TStringStream; begin if OpenDialog1.Execute then begin cHttp := TNetHTTPClient.Create(nil); vData := TMultipartFormData.Create; vRsp := TStringStream.Create('', TEncoding.GetEncoding(65001)); try vData.AddField('paramater1', '....'); vData.AddFile('filename', OpenDialog1.FileName); with cHttp do begin ConnectionTimeout := 20000; ResponseTimeout := 100000; // 100秒 AcceptCharSet := 'utf-8'; ContentType := 'multipart/form-data; UserAgent := 'Embarcadero URI Client/1.0'; try Post('http://******/upfile', vData, vRsp); //上传2G以上的大文件报错:out of memory ....... 检查发现是 TMultipartFormData.AddFile方法,把文件全部读取内存导致,于是我修改 TMultipartFormData.AddFile方法,用TFileStream替代TMemoryStream.代码如下: procedure TMultipartFormData2.AddFile(const AField, AFilePath: string; const AContentType: string); var LFileStream: TFileStream; LTempStream: TFileStream; begin AdjustLastBoundary; WriteStringLn('--' + FBoundary); WriteStringLn('Content-Disposition: form-data; name="' + AField + '"; filename="' + ExtractFileName(AFilePath) + '"'); // do not localize WriteStringLn('Content-Type: ' + AContentType + #13#10); LFileStream := TFileStream.Create(AFilePath, fmOpenRead); try // if (FMaxStreamSize>0) and ((FStream.Size+LFileStream.Size)>FMaxStreamSize) then //// 如果内容大于阈值,则使用临时文件 if True then begin FTempFileName := TPath.GetTempFileName; LTempStream := TFile.Create(FTempFileName); LTempStream.CopyFrom(FStream, 0); FStream.Free; FStream := LTempStream; end; FStream.CopyFrom(LFileStream, 0); finally LFileStream.Free; end; WriteStringLn(''); end; 这样POST上传大于2G的文件没有问题,但是POST上传4G以上的文件报错: Error sending data: (87) 参数错误。 而且是很有规律的报错,发送大于4G的文件,发送1分钟准时报错这个错误。 发送小于4G的文件即使传送时间大于10分钟都不会报错。