mOrmot 是是业界公认 非常优秀的 代码库,支持几乎所有流行的Pascal 开发环境,跨平台(不彻底),高效率。 示例程序多!但还可以更多:比如示例中只有下载,却没有发现上载的。经过在其论坛和网上搜索,发现下面的 代码可以实现上载:
function UploadFile(FileName: string): Boolean;
var
rlt, url: SockString;
D: Variant;
ms: TMemoryStream;
LRawBytes: RawByteString;
begin
ms := TMemoryStream.Create;
try
ms.LoadFromFile(FileName);
LRawBytes := StreamToRawByteString(ms);
TDocVariantData(D).AddValue('filename', ExtractFileName(FileName));
TDocVariantData(D).AddValue('data', GetFileBase64Bytes(FileName)); // 一定Base64 编码不然接收不到完整数据
url := SockString(Format('http://%s:%s/UpFile/', [gServerIP, gServerPort]));
// 这里是关键
rlt := TWinHTTP.Post(url, SockString(D),
SockString('Content-Type: multipart/form-data; boundary=' + IntToHex(Random(MaxInt), 8)
+ '_info_boundary'), True, nil); // True :aIgnoreSSLCertificateErrors
Result := rlt = 'OK';
finally
ms.Free;
end
end;
这种方法仍然不够高效,因为要转为 base64编码,这样增加了传输的负担(1/3),希望能有更好的方法。
上面的 url 中“UpFile” 是服务端解析约定的字符串, 服务器接收文件数据并保存后,返回"OK" 。可以自行定义。