Dateien vom Webserver senden per XB2.NET

Xb2.Net von Boris Borzic

Moderator: Moderatoren

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann »

Moins,
eine Frage: Ich möchte dem User die Möglichkeit geben, eine Datei downzuloaden.
Sie liegt (aus Sicherheitsgründen) nicht in bzw. unterhalb meines www-roots, also kann ich kein einfaches href=... nehmen.
Ich habe vielmehr mit :sendfile() gearbeitet - klappt wunderbar!
Nur ein Problem: Die Datei heißt dann auf Clientseite standardmässig so, wie meine entsprechende Funktion mit der Endung der eigentlichen Datei - ich möchte aber gerne den "echten" Dateinamen beibehalten!
Gibt es eine Möglichkeit, dies zu tun? Ich habe (zumindest bei :sendfile()) keine entsprechende Möglichkeit gesehen...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Martin,

mit welchem Browser ?

ich nutzte ja normales CGI und ab und zu (eher selten) habe ich den gleichen Efekt auf dem Firefox Browser. Mit dem IE kommt immer der Dateiname der auch übergeben werden soll (bei CGI legt man diesen in den Metadaten für den Web-Server ab).
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
das sollte in dem Fall eigentlich egal sein - ich habe es mit dem IE und Opera versucht...
Mein HTML-Code sieht so aus:

Code: Alles auswählen

http://localhost/DownloadUpdate?DATEI=C%3A%5CEasydog%5Cupdates%5CAllgemein%5CLockware_XM_iLock.zip
Und die Datei, die dann lokal gespeichert werden soll, heißt dann standardmässig DownloadUpdate.zip

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hmm,
so wie ich das sehe, wird es keine Lösung geben - leider!
Ich könnte da so umgehen, dass ich um jeden Knopf herum eine eigene FORM baue und im ACTION den Name des Files hinterlege - dann würde das gehen.
Nachteil: Ich muss dann auch eine Funktion haben, die so heißt, wie das File.
Und dann wäre das ja wieder nicht dynamisch!
So, wie es jetzt ist, kann ich eine x-Beliebige Datei in das Verzeichnis legen und man hat Zugriff darauf!
Naja, werden die Kunden wohl damit leben müssen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Martin,

den Namen der Datei im normalen Zugriffspfad ist aber nicht so toll.
Bist du sicher, dass du den richtigen Xb2.NET Befehl für FileDownload (also vom Server an den Client) nutzt ? Ein normaler Link auf die Datei auf dem Server wird da eigentlich nicht verwendet.

Wie besagt bei meinen CGI Programmen übergibt der Server irgend eine Action, die mein Programm intern dann als Aufforderung sieht eine Datei zurückzugeben (von der Platte irgendwo oder on the fly erzeugte ZIP oder PDF). Diese Datei wird an einen CGI Vorspann gehängt, der die Dateigröße und den Dateinamen übergibt. Und der z.B. Apache gibt diese Datei dann an den Browser mit dem definierten Namen zurück (zumindest meist ;-) ) .

Hier der Code der den Header vor den PDF Dateinamen setzt und an den WEB Server zurückgibt. Dieser gibt das entweder direkt weiter oder verarbeitet die Info noch irgendwie (keine Ahnung):

Code: Alles auswählen

   if file(cPfad+cPDFFileName)
      cPDF := File2Str(cPfad+cPDFFileName) // Datei einlesen
      cTxt := "Content-type: application/pdf"+CRLF+;
              "Content-length: "+STR(len(cPDF))+CRLF+;
              "Content-disposition: attachment filename="+cPDFFileName+CRLF+CRLF+;
              cPDF
      FWrite( FH_STDOUT , cTxt )
Bau es doch einfach mal so ein und schau was passiert.
Ansonsten musst du den vergleichbaren Befehl in XB2.NET suchen oder bei Boris nachfragen.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
sorry, da habe ich mich vielleicht missverständlich ausgedrückt! Ich habe die Dateien extra nicht im normalen Zugriffspfad liegen - also nicht in wwwroot und auch nicht darunter - sondern in einem ganz anderen Verzeichnis - somit kann ich auch keinen normalen link dahin legen (was zumindest den richtigen Dateinamen liefern würde), sondern muss die Datei als solches zurückschicken an den client. Und das geschieht einfach mit dem Befehl oClient:SendFile( Pfad_und_Name_der_Datei ).
Dabei erhält der Client die Daten einfach zugestreamt und muss sich halt um das Speichern (oder direkte Öffnen) kümmern.
Problem dabei: Ich kann den Namen der Datei nicht mitgeben - dies ist Standardmässig der Name des Formulars...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Martin,

schildere doch mal Boris das Problem, vielleicht ändert er dies für die Zukunft und verrät dir was er in SendFile() macht. Sicher hat ER dort den Standarddateinamen aus dem Formular-Namen gebildet. Wenn es Xbase++ Code ist könntest du es ja nachbilden. Eigentlich müsste es ein TCP Socket-Befehl auf die offene Verbindung sein.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
genau das (Name des Formulares) war ja der Tipp von Boris - ist aber in meinem Fall nicht praktikabel, da ich ja variabel sein will.
Ich hatte auch schon überlegt, dynamisch eine neue Seite zu generieren, die einfach ein refresh macht und als Parameter den entsprechenden File bekommt - aber das geht ja natürlich nicht, da er nicht im wwwroot-Pfad liegt...
Naja, wie gesagt: Sollen die Kunden halt mit leben...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Martin,

bei unserem Treffen hast du erwähnt, dass der Server eine Seite zurückgeben kann und der Webbrowser direkt auf einen Anker springt.

Hast du das schon mal gemacht ?

Normalerweise ist es ja so, dass der Webbrowser dies direkt anfordert:

Browser:
www.xyz.de/html.htm#ziel

oder über einen internen HREF nach #ZIEL springt.

Wenn aber in einer Webanwendung nur diese aufgerufen wird und die Antwortliste z.B. 200 Zeilen beträgt und diese irgendwo ein ZIEL enthält, wie kann der Server dem Web-Browser da klarmachen, dass er auf dieses - nicht angeforderte Ziel - springt ?

Ich persönlich tendiere ja eher zu einer Begrenzung der Antwortmenge, aber es interessiert mich jetzt persönlich :D
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
schau Dir mal die folgende Zeile an:

Code: Alles auswählen

text1 += '<meta http-equiv="refresh" content="0; URL=/html.htm#ziel">'
Damit würde sofort die Seite html.htm nachgeladen und dort der Anker ziel angesteuert werden.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Martin,

ich versuche es mal, aber bei meinen Aufrufen steht hinten keine HTML Datei sondern die EXE im CGI-BIN Verzeichnis ... alles dynamisch erzeugt und nur für diese eine Zielperson ...
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
dann versuche es mal mit der onload-Funktion.
Da rufst Du dann Deinen internen Anker auf - dann sollte es gehen...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von ramses »

Hallo Martin

wie hast du das Problem schlussendlich gelöst?

Habe das selbe, nur will ich eine Kundenspezifische PDF Datei zum Client senden die der Browser dann in einem neuen Tab/Fenster anzeigt

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von brandelh »

Hi,

grundsätzlich musst die Antwort den richtigen Content-type etc. angeben und
sich selbst auch zurückgeben. Eine Datei von einem CGI-Programm wird so zurückgegeben,
wobei diese dann meist einen "Speichern / Öffnen Dialog ausführt".

Code: Alles auswählen

*------------------------------------------------------------------
function SendePDFFile(cPfad,cDatei)
   local cPDF, cTxt
   cPDF := File2Str(cPfad+cDatei) // Datei einlesen
   cTxt := "Content-type: application/pdf"+CRLF+;
           "Content-length: "+STR(len(cPDF))+CRLF+;
           "Content-disposition: attachment; filename="+cDatei+CRLF+CRLF+;
           cPDF
   FWrite( FH_STDOUT , cTxt )
   quit
return nil
mit Xb2.net kenne ich mich aber nicht aus.

Bei sehr großen Dateien sollte man eventuell nicht alles auf einmal in den Speicher laden sondern eine Schleife bauen.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann »

Hallo Carlo,
bin gerade im Urlaub - habe es aber damals gelöst.
Piek mich doch bitte ab Montag noch Mal an, dann poste ich Dir die Lösung.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann »

Moin Carlo,
hier mal schnell der Sourceteil:

Code: Alles auswählen

PROCEDURE DownloadUpdate()
local oClient := ThreadObject()
local pfad
Local cUID
Local cPWD
local cString
local r := oClient:HTTPResponse

	pfad := oClient:GetVar( "DATEI" )
	if empty( pfad )
		// no user ID specified - redisplay login screen
		EW_Login()
		Return
	endif
	if file( updatepfad + "\" + xbUnEscape( pfad ) )
		cString := substr( xbUnEscape( pfad ), at( "\", pfad ) + 1, )
		r:SetHeader( "Content-Disposition","attachment; filename=" + cString )
		r:ContentType := "application/octet-stream"
		r:SetHeader( "Content-Transfer-Encoding", "binary" )
		r:SetHeader( "Accept-Ranges", "bytes" )
		r:SetHeader( "Cache-Control", "private" )
		r:Content := MemoRead( updatepfad + "\" + xbUnEscape( pfad ) )
	endif
RETURN
Entscheidend ist: In der Cargovariablen DATEI ist der Name der Datei, die heruntergeladen werden soll, abgelegt. Die Variable updatepfad enthält das Verzeichnis, in dem die Dateien liegen (nicht www_root!!!)
Und nun kommt das eigentliche: Im Response müssen im Header beim Content-disposition der Dateiname mitgegeben werden und im Content kommt dann der Inhalt der Datei.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von brandelh »

Und das wird dann gleich automatisch zurückgegeben oder muss man einen "Ausführen" Befehl aufrufen ?
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann »

Moin,
das ist die Funktion, die aufgerufen wird, wenn man dem link dorthin folgt.
Bsp.:

Code: Alles auswählen

<A HREF="/DownloadUpdate?DATEI=' + xbEscape( aUpdates[ i, 5 ]  + "\" + aUpdates[ i, 1 ] ) + '" title="Update herunterladen"><img SRC="/altem/file.gif" BORDER=0></A>
In meinem Fall sind das zip-Dateien. Bei PDF muss Carlo mal mit den Einstellungen für content-type experimentieren - oder es so lassen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von brandelh »

Ich verwende bei PDF "Content-type: application/pdf" - im Apache gibt es eine ganze Liste
mit verfügbaren "Content-type" Typen, da habe ich mir das damals rausgesucht.
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von ramses »

Danke für die schnellen Antworten, ich werde mit den beiden Varianten mal experimentieren, bin aber zur Zeit auch im Urlaub, da ist die Zeit am PC einwenig knapp sonst leidet der "Haussegen" .....

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann »

Hubert,
setzt Du auch Content-length? Und wenn ja, wie? Einfach die Größe der Datei (in Byte)? Und wenn ja, machst Du das auch mit den restlichen Angaben, wie ich oben?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von ramses »

Hallo

@Martin: Die Content Länge wird von XB2net automatisch gesetzt, zeigt mir jedenfalls mein http-sniffer mit welchem ich den Traffic zwischen Server und Browser beim Testen untersuche.

Nach einigem googlen und Testen musste ich leider feststellen dass es nicht möglich ist ein PDF das nicht statisch im www-root vorhanden ist direkt in einem neuen Browserfenster anzuzgeigen und den Filenamen dazu mitzugeben. Als Attachement so wie Martinn beschieben hat geht es, nicht jedoch als Anzeige, da wird immer der Funktionsname der das PDF übermittelt angezeigt. Nach dem Motto: "quick and dirty" habe ich doch noch eine zufriedenstellende Lösung gefunden.

In der dynamisch erzeugten Seite steht:

Code: Alles auswählen

<A HREF="/PDF_b0001?SESSIONKEY=48D747DB00553EA0" TARGET="_blank">PDF-File</A>
Meine PDF Files haben alle zuerst Zeichen dann eine 4 Stellige Nummer.

Im HTTPHandler des Web-Servers habe ich folgende Zeilen eingesetzt:
(unmittelbar vor dem Ausführen des Macros)

Code: Alles auswählen

      // Workaround:
      // zur Titelanzeige der PDF Filenamen bei Anzeige der PDF's im Browser
      // und beim speichern der Files 
      // PDF Namen sind IMMER 5 stellig mit ABRCL als erstes Zeichen    
      // PDF Req. umsetzten auf web_postPDFFile  
      if left(cName,8) == "WEB_PDF_" .and. len(cname) = 13 .and. upper(substr(cName,9,1)) $ "ABRCL"  
         cWebFunction := "Web_PostPDFFile('"+substr(cName,9,5)+"')"
         cName := "WEB_PostPDFFile"
      endif
Dieser ruft für alle passenden Filenamenmuster die Funktion 'Web_PostPDFFile' auf die das File übermittelt.

Code: Alles auswählen

PROCEDURE Web_PostPDFFile(fname)
    local oClient := ThreadObject()
    local path := "f:\"
    local r    := oClient:HTTPResponse
    local sid  := oclient:getVar("SESSIONKEY")
    
    default fname to "" 
     
      if !empty(fname) .and. ! "." $ fname
           fname += ".pdf"
      endif
               
      if file( path+fname ) .and. !empty(fname)  // Test auf 'empty' zwingend
          r:ContentType := "application/pdf"  
          r:SetHeader( "Content-Transfer-Encoding", "binary" )
          r:SetHeader( "Accept-Ranges", "bytes" )
          r:SetHeader( "Cache-Control", "private" )
          r:Content := MemoRead( path + fname )
       else 
          r:content := "File nicht vorhanden." 
       endif
    RETURN
So habe ich erreicht dass der Kunde immer einen individuellen Filenamen vorgeschlagen bekommt unter dem er das PDF Speichern kann und das dem Inhalt entspricht. In meinem Bsp. b0001 für Bestellung 1 mit dem ständig gleichen Vorsatz PDF_ kann man leben, klar könnte man diesen weglassen .....

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann »

Moin Carlo,
genau - diesen von Dir geschilderten Fall (Dateiname=Functionname) hatte ich vor dem Setzen der jeweiligen Header auch gehabt.
Wenn Du eine Fehlermeldung setzt, solltest Du auch ruhig den StatusCode entsprechend mit setzen (auf 404 - Not Found).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von brandelh »

Martin Altmann hat geschrieben:Hubert,
setzt Du auch Content-length? Und wenn ja, wie? Einfach die Größe der Datei (in Byte)? Und wenn ja, machst Du das auch mit den restlichen Angaben, wie ich oben?
Viele Grüße,
Martin
Hallo Martin,

etwas über deinem Quellcode steht meiner ;-)
dort kann man sehen wie ich die content-length setze. Bei mir funktioniert es auf Client-Seite so, dass man gefragt wird ob man die Datei speichern, anzeigen etc. will.
Der Dateiname stimmt auch, allerdings gab es mit einigen Versionen vom FireFox Probleme, da er ab und zu den EXE Namen der Anwendung genommen hat.
Dieser Fehler trat mit dem IE nie auf und schon länger nicht mehr mit den aktuellen Versionen.

Ob die PDF direkt im neuen Fenster des Browsers geöffnet wird hängt aber auch von der Einstellung des Browsers ab, ich habe das grundsätzlich untersagt.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann »

Ahh - OK!
Dein File2Str() ist im Prinzip ein Memoread - oder?
Und die Länge des strings entspricht dann der Größe der Datei im Filesystem (in Byte) - oder?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten