PDF mit Base64Encoder versenden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: PDF mit Base64Encoder versenden

Beitrag von mk-soft »

Obwohl bei meinen Modul NetworkTCP für das Netzwerk und der CPU die Parameter Ressourcen schonend eingestellt ist, übertrage ich 1 Megabyte unter 10 Sekunden im lokalen Netzwerk.
Die Grundeinstellung sind für die Nutzdaten 4096 Byte pro Block und eine Delay Blockzeit von 20 ms.

Da muss bei deinen Test ein Fehler passiert sein.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag von NicTheQuick »

Ich denke auch, dass da dann ein Fehler im Code war. Denn 2,5 MB sind ja im Grunde nichts. Im lokalen Netzwerk mit 1 GBit/s sind 2,5MB in aufgerundet 20 ms versendet.
Bild
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag von stevie1401 »

Hm, ich weiss zwar nicht, wie sich da ein Fehler einschleichen soll, wenn ich doch genau den Code benutze und nichts verändert habe, aber schon klar, natürlich ist immer der Anwender Schuld.
Hilft mir übrigens bei meiner Ursprungsfrage nicht wirklich weiter.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag von NicTheQuick »

Uns hilft es auch nicht weiter, wenn du glaubst im Recht zu sein und uns nicht den Code zeigst, der nicht funktioniert. Dir sollte klar sein, dass 2,5 MB im Bruchteil einer Sekunde übertragen werden sollte. Und mit simplen Netzwerkbefehlen ist das auch so. Das mache ich öfter so und erreiche viele Megabytes pro Sekunde.

Also zeig doch mal, was du bisher gemacht hast, damit wir das auch nachvollziehen können. Sich blind gegenseitig die Schuld in die Schuhe zu schieben, hilft keinem weiter.

Ist das Base64-Problem mit meiner Antwort nun eigentlich gelöst oder geht das noch nicht?
Bild
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag von stevie1401 »

Beim TCP benutze ich diesen Code: viewtopic.php?f=8&t=31321
Ohne Veränderung. Deshalb weiss ich nicht, wo ICH da einen Fehler machen soll.

Tja, ich verzweifle manchmal in diesem Forum, da ich nicht verstehe was ihr nun von mir wollt.
Den Code habe ich bereits ganz am Anfang gepostet. Und dieser funktioniert halt nicht.

Ich weiss nicht, wie ich den empfangegen Datenstring dann wieder in eine PDF umwandeln kann.

Der Client arbeitet mit WEBSOCKETS, deshalb benötige ich - zumindest ist das mein Wissenstand - Base64, um die PDF-Datei zu empfangen.
Aber ich lasse mich sehr gerne mit einem leicht verständlichen BEISPIEL eines Besseren belehren.
Zuletzt geändert von stevie1401 am 10.07.2019 08:41, insgesamt 1-mal geändert.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: PDF mit Base64Encoder versenden

Beitrag von Mijikai »

Hier mal Code der eine Datei in Base64 umwandelt.

Code:

Code: Alles auswählen

EnableExplicit

;FileBase64
;Author: Mijikai

Global base64.i

Procedure.i FileBase64(File.s)
  Protected handle.i
  Protected *src
  Protected *con.Integer
  Protected src_siz.i
  Protected con_siz.i
  If File
    handle = ReadFile(#PB_Any,File)
    If IsFile(handle)
      src_siz = Lof(handle)
      *src = AllocateMemory(src_siz)
      If *src
        If ReadData(handle,*src,src_siz) = src_siz
          con_siz = (src_siz << 1) + SizeOf(Integer)
          *con = AllocateMemory(con_siz)
          If *con
            *con\i = Base64EncoderBuffer(*src,src_siz,*con + SizeOf(Integer),con_siz)
            If Not *con\i
              FreeMemory(*con)
              *con = #Null
            EndIf 
          EndIf
        EndIf 
        FreeMemory(*src)
      EndIf 
      CloseFile(handle)
    EndIf 
  EndIf 
  ProcedureReturn *con
EndProcedure

Procedure.i FileBase64Size(*base64.Integer)
  If *base64
    ProcedureReturn *base64\i
  EndIf 
  ProcedureReturn #Null
EndProcedure

Procedure.i FileBase64Buffer(*base64)
  If *base64
    ProcedureReturn *base64 + SizeOf(Integer)
  EndIf 
  ProcedureReturn #Null
EndProcedure

Procedure.i FileBase64Free(*base64)
  If *base64
    FreeMemory(*base64)
  EndIf 
  ProcedureReturn #Null
EndProcedure

base64 = FileBase64("TestFile.bin")

ShowMemoryViewer(FileBase64Buffer(base64),FileBase64Size(base64))

End

Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: PDF mit Base64Encoder versenden

Beitrag von dige »

@Stevie: was du machen willst ist ein PDF Download und Ansicht im Browser, oder?

Wenn du das mit WebSocket machst, ist das unnötig kompliziert.

Clientseitig (SpiderBasic) kannst du eine Datei Downloaden mittels JavaScript window.open()

Code: Alles auswählen

; SpiderBasic
Procedure Download(Filename.s, Parameter.s = "")
  !  if (v_parameter != "") {
  !    var win = window.open(v_filename, v_parameter);
  !    win.focus();
  !  } else {
  !    window.open(v_filename);
  !  }
EndProcedure

Download ("https://buildmedia.readthedocs.org/media/pdf/django-leaflet/latest/django-leaflet.pdf")
Für den Server würde ich dir von PB abraten. Nimm lieber ein Freeware Apache Projekt oder Nginx.
Die sind viel schneller und robuster..

Ciao Dige
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag von stevie1401 »

Vielen Dank für eure Hilfe! :)
Leider wird aus vielerlei Gründen mein Knowhow nicht über Spider- und Purebasic hinaus gehen können, deshalb suche ich halt nach Lösungen auf dieser Ebene, wohl wissend, dass ich da keine "Wunder" erwarten kann.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
TroaX
Beiträge: 660
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag von TroaX »

Naja Spiderbasic setzt in der Regel sowieso einen Web-Server vorraus. Spiderbasic ist ja dazu da, RIA's (Rich Internet Applications) zu realisieren. Ein Webserver sollte also in der Regel sowieso da sein. Wenn du hingegen zum Beispiel eine lokale Desktop-Anwendung realisieren möchtest und über das PBEx Webgadget anzeigen willst, solltest du einen Webserver in die Anwendung integrieren. Und das aus folgenden Gründen:

1. Viele Javascript Netzwerk-Geschichten erfordern die Einhaltung der Origin-Richtlinien. Javascript setzt daher vorraus, das eine IP/Domain die Anwendung ausliefert.
2. Der Websocket ist nicht dazu gedacht, Dateien zu übertragen. Denn Javascript kann über den Browser nur eingeschränkt auf das Dateisystem zugreifen, wodurch du Probleme beim Speichern der Datei bekommen wirst.
3. Kann ein Webserver die Dateien super einfach ausliefern, weil genau das seine Hauptaufgabe ist.

Wenn du also eine Purebasic-Anwendung als Server verwenden willst, ist das erst einmal kein Problem. Du kannst ja trotzdem über Socket mit dem Client arbeiten. Aber das Übertragen von Dateien sollte man einem Webserver überlassen, da der Browser die Dateien so verarbeitet, wie er es verarbeiten soll.

Wenn die Anwendung im Intranet laufen soll (nicht über das Internet erreichbar), dann reicht ein einfacher Webserver problemlos aus. Suche hier nach nanoHTTP. Das ist mein Webserver zum einbinden in die eigene Purebasic-Anwendung. Im Internet empfehle ich hingegen einen etablierten Webserver, den du entweder als Reverse-Proxy vor nanoHTTP setzt (wegen Verschlüsselung etc.) oder nanoHTTP weglässt und ihn die Daten ausliefern lässt.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Antworten