Seite 2 von 2

Re: PDF mit Base64Encoder versenden

Verfasst: 07.07.2019 12:16
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.

Re: PDF mit Base64Encoder versenden

Verfasst: 07.07.2019 21:06
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.

Re: PDF mit Base64Encoder versenden

Verfasst: 08.07.2019 09:20
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.

Re: PDF mit Base64Encoder versenden

Verfasst: 08.07.2019 10:57
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?

Re: PDF mit Base64Encoder versenden

Verfasst: 09.07.2019 08:21
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.

Re: PDF mit Base64Encoder versenden

Verfasst: 09.07.2019 09:54
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


Re: PDF mit Base64Encoder versenden

Verfasst: 09.07.2019 10:10
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

Re: PDF mit Base64Encoder versenden

Verfasst: 10.07.2019 09:02
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.

Re: PDF mit Base64Encoder versenden

Verfasst: 10.07.2019 09:37
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.