Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Autoupgrader soll Datei ueber PHP-Skript laden (https://www.delphipraxis.net/116329-autoupgrader-soll-datei-ueber-php-skript-laden.html)

Kharlanki 26. Jun 2008 22:54


Autoupgrader soll Datei ueber PHP-Skript laden
 
Hallo,

ich nutze den AutoUpgrader von Utilmind zum Aktualisieren (m)eines Programmes.
Nun moechte ich gerne wissen, wieoft das Update heruntergeladen wird. Darum gebe ich in der Steuerdatei (.inf), die auf dem Webspace liegt, statt des direkten Pfades ein PHP-Skript an, das neben der Dateiausgabe noch die Zugriffe zaehlt.

Code:
     
[...]
$filename = "/users/[...]_setup.exe";
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"[...]_setup.exe\"");
readfile($filename);
Der direkte Aufruf funktioniert. Der Autoupgrader roedelt zwar herum (die Anzeige der Uebertragungsgeschwindigkeit schwankt), aber es wird keine temporaere Datei angelegt. Und aktualisiert wird dann nach dem Neustart des Programmes auch nichts.

Wer weiss Rat?

p0w3r5tr34m3r 26. Jun 2008 23:37

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
du hast dem 2. php-skript die erforderlichen Rechte gegeben und die [...]_setup.exe ist auch eine aktualisierte version?

ansonsten hast du vielleicht auf dem "client"-Rechner keine Schreibrechte?!

als letzte möglichkeit wäre da noch das Utilmind einen direkt download der datei $filename erstellt... Sprich du lädst nicht die .exe sondern die .php runter...


so long,
p0w3r5tr34m3r

Kalfany 27. Jun 2008 09:40

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
Versuch mal im header noch die größe der Datei mitzugeben (Content-Size oder Content-Lenght müsse das sein)

Kharlanki 27. Jun 2008 10:12

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
Zitat:

Zitat von p0w3r5tr34m3r
du hast dem 2. php-skript die erforderlichen Rechte gegeben und die [...]_setup.exe ist auch eine aktualisierte version?
ansonsten hast du vielleicht auf dem "client"-Rechner keine Schreibrechte?!
als letzte möglichkeit wäre da noch das Utilmind einen direkt download der datei $filename erstellt... Sprich du lädst nicht die .exe sondern die .php runter...

Das Script kann ich manuell ja aufrufen. Dann funktionierts auch mit dem Download und dem Counter.
Schreibrechte auf dem Rechner sind auch nicht das Problem.
Dafuer, dass nur das Skript runtergeladen wird, dauert der Download zu lange. Es muss schon die richtige Datei sein. Zumindest vom Traffic her...

Zitat:

Zitat von Kalfany
Versuch mal im header noch die größe der Datei mitzugeben (Content-Size oder Content-Lenght müsse das sein)

$groesse = filesize("$filename");
header("Content-Length: $groesse");

Das habe ich auch schon versucht. Dann zeigt er zwar die Groesse im Fortschrittsfenster an, aber kommt ueberhaupt nicht aus den Hufen. D.h. er laedt dann ueberhaupt nichts.

Kalfany 27. Jun 2008 10:27

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
Hast du schon mal was anderes bei Content-Type anstelle von application/octet-stream versucht ... gibts ja noch mehr.

und/oder mit "Content-Transfer-Encoding: binary"

littleDave 27. Jun 2008 10:58

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
Ich hab mal vor längerer Zeit auch ein Download-Script erstellt und hatte damit bisher keine Probleme. Vielleicht hilft dir das ja:

Code:
$FileName = 'myFile.zip';
$FilePath = '/downloads/';

// Dateiendung auslesen
$extension = strtolower(substr(strrchr($FileName, "."), 1));

// MIME-Typ der Datei-Endung
switch($extension){
    case "asf":    $type = "video/x-ms-asf";               break;
    case "avi":    $type = "video/x-msvideo";              break;
    case "exe":    $type = "application/octet-stream";     break;
    case "mov":    $type = "video/quicktime";              break;
    case "mp3":    $type = "audio/mpeg";                   break;
    case "mpg":    $type = "video/mpeg";                   break;
    case "mpeg":   $type = "video/mpeg";                   break;
    case "rar":    $type = "encoding/x-compress";          break;
    case "txt":    $type = "text/plain";                   break;
    case "wav":    $type = "audio/wav";                    break;
    case "wma":    $type = "audio/x-ms-wma";               break;
    case "wmv":    $type = "video/x-ms-wmv";               break;
    case "zip":    $type = "application/x-zip-compressed"; break;
    default:       $type = "application/force-download";   break;
}

// Einen Bug im IE umgehen: Punkte im Dateinamen sollen durch ein "%2e" ersetzt werden
$header_file = (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE'))
               ? preg_replace('/\./', '%2e', $FileName, substr_count($FileName, '.') - 1)
               : $FileName;
               
// Header-Daten anpassen
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public", false);
header("Content-Description: File Transfer");
header("Content-Type: " . $type);
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=\"" . $header_file . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($FilePath.$FileName));


// Daten Senden

Kharlanki 27. Jun 2008 12:01

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
Danke fuer das Skript. Aber leider laeufts auch damit nicht.
Sobald das "Content-Length" drin ist, hakt der Download ueber den AutoUpgrader. Wenn das nicht drin ist, wird zwar keine Dateigroesse angezeigt, aber immerhin wird was heruntergeladen, was vom Volumen her der Downloaddatei entspricht. Aber es wird keine temporaere Datei angelegt wie beim direkten Download ueber die Komponente, aber ohne das PHP-Skript dazwischen.
Den Content-Type habe ich auch mal auf application/x-msdos-program geaendert. Das hat mir Live HTTP Headers beim manuellen Herunterladen angezeigt.

Kalfany 27. Jun 2008 12:36

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
Hast du schonmal einen anderen dateityp (z.B. ZIP) probiert?
Irgend einen Virenscanner (oder ähnliches) am laufen?

gibts denn bei dem autoupgrade irgendwie die möglichkeit anzuschaun was er den läd?

Kharlanki 27. Jun 2008 14:51

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
Am Virenscanner kanns wohl nicht liegen, da es manuell ja auch klappt. Eine Logfunktion hat die Komponente leider auch nicht.

Kharlanki 27. Jun 2008 23:32

Re: Autoupgrader soll Datei ueber PHP-Skript laden
 
Problem geloest! :)

Die Komponente hat partout drauf bestanden, dass die Datei so heisst wie die zu ladende URL, auch wenn das PHP-Skript einen neuen Namen gemeldet hat... Und einen Dateinamen wie download.php?version=1.2.3 mag Windows nicht besonders. ;)

Loesung:
Der Autoupgrader ruft die Steuerdatei ab. Dort ist die zu ladende URL die Zieldatei. Diese wird mit mod_rewrite jedoch auf das Download-Skript umgebogen. Im Skript wird nun aus der Steuerdatei die Versionsnummer ausgelesen, der Counter fuer diese Version in der Datenbank inkrementiert und dann die Zieldatei wie gehabt zum Download angeboten. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz