Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   curl mit @ im Dateinamen nach Pascal übersetzen (https://www.delphipraxis.net/213860-curl-mit-%40-im-dateinamen-nach-pascal-uebersetzen.html)

philipp.hofmann 9. Okt 2023 18:31

curl mit @ im Dateinamen nach Pascal übersetzen
 
Hi,

bisher hatte ich immer curl-POST abgesetzt, wo ich eine Datei übertragen musste, z.B.

curl -X POST https://pushinglimits.club/api/oauth/upload_fit_file -H 'Content-Type: multipart/form-data' -H 'Authorization: Bearer ...' -F 'file=/mnt/c/Daten/Philipp/Delphi-Projects/icTrainerBase/programData/myTrainings/Philipp_(SF6KICKR)_20231003_1941_Freies_Training_T raining.fit'

Dazu habe ich folgende Struktur aufgebaut:

Delphi-Quellcode:
Http: TNetHTTPClient;
formData: TMultipartFormData;
headers: TNetHeaders;

Http:=TNetHTTPClient.create(nil);
formData:=TMultipartFormData.create();
headers:=TNetHeaders.create();
setLength(headers, 2);
headers[0]:=TNameValuePair.create('Content-Type', 'multipart/form-data');
headers[1]:=TNameValuePair.create('Authorization', 'Bearer ' + bearer);
formData.AddFile('files[]', filename);
Http.Post('https://pushinglimits.club/api/oauth/upload_fit_file',formData,nil,headers);
Jetzt muss ich aber ein Array von files übertragen, was im curl-Befehl folgendermaßen aussieht:

curl -X POST https://pushinglimits.club/api/oauth/upload_fit_file -H 'Content-Type: multipart/form-data' -H 'Authorization: Bearer fa6af31a13e86e586b38d76317349749d0a58a46' -F 'files[]=@/mnt/c/Daten/Philipp/Delphi-Projects/icTrainerBase/programData/myTrainings/Philipp_(SF6KICKR)_20231003_1941_Freies_Training_T raining.fit'

Wie bekommt ich jetzt das '@' in den Befehl via Delphi? Einfach nur
Delphi-Quellcode:
formData.AddFile('files[]', '@'+filename);
ist es nicht, dann wird die Datei nicht gefunden.

Vielleicht hat da ja jemand einen Tipp.

Grüße, Philipp

jaenicke 9. Okt 2023 19:34

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
Das @ gehört doch nur zu cUrl. Wenn du den Upload selbst macht, gehört das nicht dazu.

philipp.hofmann 9. Okt 2023 20:57

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
Yepp, danke. Dann muss es irgendwie an dem erwarteten Array liegen, dass es nicht klappt. Ich bekomme, wenn ich das POST durchführe eine Fehlermeldung zurück:

'<!DOCTYPE html>'#$A'<html lang="en">'#$A'<head>'#$A'<meta charset="utf-8">'#$A'<title>Error</title>'#$A'</head>'#$A'<body>'#$A'<pre>Cannot POST /oauth/upload_fit_file</pre>'#$A'</body>'#$A'</html>'#$A

Da muss ich mal mit dem Schnittstellen-Hersteller quatschen.

jaenicke 9. Okt 2023 21:11

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
Aber mit cUrl klappt es?

Dann schicke die Daten doch einfach an einen lokalen Webserver ohne SSL, sprich nur via http. Dann kannst du die beiden Anfragen ganz einfach z.B. in Wireshark vergleichen oder auch in anderen Tools.

philipp.hofmann 9. Okt 2023 21:58

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
Schaue ich mir morgen mal genauer an. Am Array liegt es nicht. Der Status-Code ist übrigens 404, obwohl es via cURL geht. Da muss irgendwas an den http-Settings schräg sein.
Der gleiche Code klappt an anderer Stelle mit x anderen Upload-Anbietern.

Edelfix 10. Okt 2023 09:15

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
Eventuell hilfreich:

Delphi-Quellcode:
      if pos('https', LowerCase(URL))<>0 then
        Http.SecureProtocols := [THTTPSecureProtocol.TLS12];

philipp.hofmann 10. Okt 2023 09:39

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das TLS 1.2 passiert automatisch, dies habe ich auch schon im Hintergrund gecheckt. Ich habe jetzt auch mal TMultipartFormData.GenerateBoundary so angepasst, dass die gleiche Boundary aufgebaut wird, das ist es aber auch nicht.

Kas Ob. 10. Okt 2023 09:42

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
I am afraid that there is no easy way (ready to be used API), and these files should be manually formed into a body request.

This show the structure
https://microsoft.public.winhttp.nar...part-form-data

The most important is the Content-Disposition to be filled right, and you must fill the "Content-Type: multipart/form-data; boundary=" not leaving it to be filled automatically.

Also you don't need that much of '-', in "boundary=" it is shorter by '-', in fact you don't need them at all in in the HTTP header, only in the body as separator you need 2 dashes "--".

philipp.hofmann 10. Okt 2023 10:14

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
Mit dem folgenden Code geht es erfolgreich via Indy:

Delphi-Quellcode:
      with TIdHTTP.Create(nil) do
      try
        var FIdSSLIOHandlerSocketOpenSSL:TIdSSLIOHandlerSocketOpenSSL:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
        var Params: TIdMultiPartFormDataStream;
        filename:=StringReplace(Training.filename, '.ictt', '.fit', [rfIgnoreCase]);
        FIdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1_2;
        FIdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
        IOHandler := FIdSSLIOHandlerSocketOpenSSL;
        Request.ContentType := 'multipart/form-data';
        Request.CustomHeaders.add('Authorization: Bearer ' + bearer);
        Params := TIdMultiPartFormDataStream.Create;
        try
          params.AddFile('file', filename, GetMIMETypeFromFile(filename));
          ResponseStr := Post('https://pushinglimits.club/api/oauth/upload_single_fit_file', Params);
        finally
          Params.Free;
        end;
      finally
        Free;
      end;
Macht von außen betrachtet, genau das gleiche, aber irgendwie scheint die interne Formatierung anders zu sein.

himitsu 10. Okt 2023 12:02

AW: curl mit @ im Dateinamen nach Pascal übersetzen
 
Zitat:

Zitat von Edelfix (Beitrag 1527898)
Eventuell hilfreich:

Delphi-Quellcode:
      if pos('https', LowerCase(URL))<>0 then
        Http.SecureProtocols := [THTTPSecureProtocol.TLS12];

Delphi-Referenz durchsuchenContainsText oder Delphi-Referenz durchsuchenStartsText :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz