Dateien vom Webserver senden per XB2.NET
Moderator: Moderatoren
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Dateien vom Webserver senden per XB2.NET
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
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
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.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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:
Und die Datei, die dann lokal gespeichert werden soll, heißt dann standardmässig DownloadUpdate.zip
Viele Grüße,
Martin
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
Viele Grüße,
Martin
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.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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
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
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.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
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):
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.
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 )
Ansonsten musst du den vergleichbaren Befehl in XB2.NET suchen oder bei Boris nachfragen.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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
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
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.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
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.
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
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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
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
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.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
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
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
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Hubert,
schau Dir mal die folgende Zeile an:
Damit würde sofort die Seite html.htm nachgeladen und dort der Anker ziel angesteuert werden.
Viele Grüße,
Martin
schau Dir mal die folgende Zeile an:
Code: Alles auswählen
text1 += '<meta http-equiv="refresh" content="0; URL=/html.htm#ziel">'
Viele Grüße,
Martin
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.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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
dann versuche es mal mit der onload-Funktion.
Da rufst Du dann Deinen internen Anker auf - dann sollte es gehen...
Viele Grüße,
Martin
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.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Dateien vom Webserver senden per XB2.NET
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
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
Gruss Carlo
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
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".
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.
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
Bei sehr großen Dateien sollte man eventuell nicht alles auf einmal in den Speicher laden sondern eine Schleife bauen.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
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
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
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.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
Moin Carlo,
hier mal schnell der Sourceteil:
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
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
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
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.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
Und das wird dann gleich automatisch zurückgegeben oder muss man einen "Ausführen" Befehl aufrufen ?
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
Moin,
das ist die Funktion, die aufgerufen wird, wenn man dem link dorthin folgt.
Bsp.:
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
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>
Viele Grüße,
Martin
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.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
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.
mit verfügbaren "Content-type" Typen, da habe ich mir das damals rausgesucht.
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Dateien vom Webserver senden per XB2.NET
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
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
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
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
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.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Dateien vom Webserver senden per XB2.NET
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:
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)
Dieser ruft für alle passenden Filenamenmuster die Funktion 'Web_PostPDFFile' auf die das File übermittelt.
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
@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>
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
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
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
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
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
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.
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 68 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
Hallo Martin,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
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
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16536
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 113 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Dateien vom Webserver senden per XB2.NET
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
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
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.