If filename contains non-ASCII (accented) characters, you have to encode it in quoted-printable format.
Code: Select all
procedure SendFile(idrealm,idannuaire:Integer; Filename:String);
Const APIendpoint = '/file/upload';
Bearer = 'eyJhbGciOiJIUzIiFMdxCX0PdvHIETXBKKYFtYDu_sPSiY1ZNLeUJg681s';
APIurl = 'https://rooturl.yourdomain.tld';
APIport = 8088;
boundary = '----------BOUNDARY'; // Feel free to add some randomness here
var
Request: TScHttpWebRequest;
Response: TScHttpWebResponse;
ResponseStr: string;
Stream: TFileStream;
FinalStream: TMemoryStream;
url: String;
s:AnsiString;
begin
url:=Format('%s:%d%s',[APIurl,APIport,APIendpoint])+Format('?realm_id=%d&idannuaire=%d',[idrealm,idannuaire]);
Request := TScHttpWebRequest.Create(URL);
Stream := TFileStream.Create(FileName, fmOpenRead);
FinalStream:=TMemoryStream.Create;
try
Request.Method := rmPut;
Request.ContentType := 'multipart/form-data; boundary='+boundary;
Request.TransferEncoding := 'binary';
Request.headers.Add('Authorization','Bearer '+Bearer);
Request.KeepAlive:=True;
s := '--'+boundary+^M+^J
+'Content-Disposition: form-data; name="file"; filename="'+FileName+'"'+^M+^J
+'Content-Type: */*'+^M+^J
+^M+^J;
FinalStream.Write(s[1],Length(s));
FinalStream.CopyFrom(Stream,Stream.Size);
s := ^M+^J+
'--'+boundary+'--'+^M+^J;
FinalStream.Write(s[1],Length(s));
FinalStream.Position:=0;
Request.ContentLength := FinalStream.Size;
Request.SendChunked := True;
Request.RequestStream := FinalStream;
Response := Request.GetResponse;
ResponseStr := Response.ReadAsString;
ShowMessage(ResponseStr);
Response.Free;
finally
FinalStream.Free;
Stream.Free;
Request.Free;
end;
end;