![]() |
Indy TCP Client: Zu langer String?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich will mit Delphi einen Screenshot aufnehmen und ihn auf meinen vServer hochladen. Ich mache dies momentan so:
Delphi-Quellcode:
Das funktioniert auch eigentlich alles, aber nicht immer...
// Erzeugt einen Base64-String aus der JPEG Bild-Datei die ich versenden will
function EncodeFile(const FileName: string): AnsiString; var stream: TMemoryStream; begin stream := TMemoryStream.Create; try stream.LoadFromFile(Filename); result := EncodeBase64(stream.Memory, stream.Size); finally stream.Free; end; end; // Kompressiert ein BMP in ein JPEG procedure CompressImage(ImageFrom: TBitmap; ImageTo: TJPEGImage; Quality: integer); var bmp: TBitmap; jpeg: TJPEGImage; stream: TMemoryStream; begin bmp:=TBitmap.Create; jpeg:=TJPEGImage.Create; stream:=TMemoryStream.Create; try bmp.Assign(ImageFrom); jpeg.Assign(bmp); jpeg.PixelFormat:=jf24bit; // or jf8bit jpeg.CompressionQuality:=Quality; jpeg.ProgressiveDisplay:=False; jpeg.ProgressiveEncoding:=False; jpeg.Compress; jpeg.SaveToStream(stream); stream.Position := 0; ImageTo.LoadFromStream(stream); finally bmp.Free; jpeg.Free; stream.Free; end; end; // Erzeugt einen Screenshot procedure ScreenShot(DestBitmap: TBitmap); var DC: HDC; begin DC:=GetDC(GetDesktopWindow); try DestBitmap.Width:=GetDeviceCaps(DC, HORZRES); DestBitmap.Height:=GetDeviceCaps(DC, VERTRES); BitBlt(DestBitmap.Canvas.Handle,0,0,DestBitmap.Width,DestBitmap.Height,DC,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow, DC); end; end; // Fängt die PrintScreen-Taste auf procedure TForm1.WMHotKey(var Msg: TWMHotKey); begin Screenshot(ss); image1.Picture.Bitmap := ss; FormStyle := fsStayOnTop; Show; end; // Upload-Funktion procedure TForm1.Upload; var URL: string; img :TJPEGImage; mes : string; cmds : TStringList; bmp : TBitmap; begin img := TJPEGImage.Create; CompressImage(ss, img, Trackbar1.Position); img.SaveToFile('./Screenshot.jpeg'); base64 := EncodeFile('./Screenshot.jpeg'); idtcpclient1.IOHandler.WriteLn('start'); idtcpclient1.IOHandler.WriteLn(base64); // Hier wird der Base64-String gesendet idtcpclient1.IOHandler.WriteLn('end'); end; Kann es sein, dass der Base64 string zu lange ist? Der Server ist in Java geschrieben, aber ich denke bei dem ist alles in ordnung. Hier noch einige Bilder: (Alle nacheinander aufgenommen und hochgeladen ohne das Programm neu zu starten) Qualität: 55%: ![]() Qualität: 100%: ![]() Qualität: 100%: ![]() Qualität: 100%: ![]() Falls es jemand selbst testen möchte, ich habe das Programm in den Anhang gelegt. Wichtig:
Ich hoffe einer kann mir da helfen, finde ich recht merkwürdig warum das manchmal klappt und manchmal nicht... Das "end" kommt ja auch immer an o_O Freundliche Grüsse |
AW: Indy TCP Client: Zu langer String?
Irgendwie fehlt hier im Post das Wichtiste (hab jetzt noch keine Lust/Zeit das runterzuladen).
Wie wird die Datei empfangen? Außerdem:
So, ich geh jetzt erstmal Mittag essen. |
AW: Indy TCP Client: Zu langer String?
Ja, Texte kann man standardmäßig nur bis
Delphi-Quellcode:
Länge senden.
IOHandler.MaxLineLength
Der Defaultwert ist 16 * 1024. Man kann diesen Wert aber erhöhen, z.B. auf MaxInt
Delphi-Quellcode:
IOHandler.MaxLineLength := MaxInt;
|
AW: Indy TCP Client: Zu langer String?
Ich würde ja gerne die Datei binär verschicken, jedoch weiss ich dann nicht wie ich diese mit Java empfangen kann.
Jeder versuch ist bisher gescheitert :/ Leider funktioniert die Methode mit .MaxLineLength auch nicht :( Gibt es hier vielleicht jemanden der sich mit Java auskennt, oder weiss vielleicht jemand einen anderen Vorschlag? Freundliche Grüsse |
AW: Indy TCP Client: Zu langer String?
Zitat:
Dann liegt seine Länge vermutlich unter der eingestellten MaxLineLength. Die erfolgreich übertragene Datei LuelxSM.jpeg hat eine Länge von 171 KB, korrekt? Dann ist das bereits über der standardmäßig in Indy eingestellten Länge. (Ich habe nicht genau recherchiert ob diese Begrenzung auf 16 KB möglicherweise nur für den Empfang gilt, vermutlich ist eine String-Übertragung beim Versand nicht in der Länge begrenzt). Wie sieht denn der Java-seitige Code aus, in dem die Daten aus dem TCP Socket gelesen werden? Kann man da Loggingausgaben einbauen, um die Anzahl der erhaltenen Bytes mit den gesendeten vergleichen zu können? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 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