Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Dateien vom Webserver senden per XB2.NET

Xb2.Net von Boris Borzic

Moderator: Moderatoren

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann » Do, 18. Okt 2007 19:09

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh » Do, 18. Okt 2007 20:58

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: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Martin Altmann » Do, 18. Okt 2007 21:06

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Martin Altmann » Fr, 19. Okt 2007 9:29

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh » So, 21. Okt 2007 16:01

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: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Martin Altmann » So, 21. Okt 2007 16:09

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh » So, 21. Okt 2007 16:24

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: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Martin Altmann » So, 21. Okt 2007 16:28

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh » Mo, 12. Mai 2008 17:08

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: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Martin Altmann » Mo, 12. Mai 2008 22:51

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh » Di, 13. Mai 2008 10:41

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: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Martin Altmann » Di, 13. Mai 2008 10:58

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

ramses
1000 working lines a day
1000 working lines a day
Beiträge: 730
Registriert: Mi, 28. Jul 2010 17:16

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von ramses » Sa, 02. Okt 2010 3:47

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von brandelh » Sa, 02. Okt 2010 9:46

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: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann » Sa, 02. Okt 2010 10:04

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann » Sa, 02. Okt 2010 22:11

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von brandelh » So, 03. Okt 2010 9:31

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: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann » So, 03. Okt 2010 9:35

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von brandelh » So, 03. Okt 2010 9:39

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
1000 working lines a day
1000 working lines a day
Beiträge: 730
Registriert: Mi, 28. Jul 2010 17:16

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von ramses » So, 03. Okt 2010 22:05

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

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann » Di, 05. Okt 2010 21:54

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

ramses
1000 working lines a day
1000 working lines a day
Beiträge: 730
Registriert: Mi, 28. Jul 2010 17:16

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von ramses » Mi, 06. Okt 2010 1:22

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

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann » Mi, 06. Okt 2010 7:38

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von brandelh » Mi, 06. Okt 2010 7:48

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: 13749
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Dateien vom Webserver senden per XB2.NET

Beitrag von Martin Altmann » Mi, 06. Okt 2010 7:53

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

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

Antworten