Pfad einer .zip-Datei beim Download verfälschen

Hi alle zusammen,

vor einiger Zeit hatte ein Clan Member seine Mod für das Spiel TrackMania United auf bplaced gehostet, allerdings musste ich auf Aufforderung von miro diese rund 25 MB große Datei entfernen, da sie zu viele Verbindungen verursacht hatte. (Die Mod wird automatisch geladen, wenn eine mit ihr erstellte Strecke auf einem Server gespielt wurde. Das können teilweise 200 Spieler gleichzeitig sein…)

Nun möchte ich diesem Clan Member aber wieder anbieten, seine Mod auf bplaced zu hosten, aber gelichzeitig vermeiden, dass dieses Problem erneut entsteht.

Warum die Mod nicht auf einem Filehoster gelagert wird? Im Spiel gibt es die Möglichkeit, durch entsprechende XML-Dateien gewisse Dateien wie Strecken oder Mods direkt zur Verfügung zu stellen, ohne das Spiel verlassen zu müssen. (Das nennt man dann einen ManiaLink, quasi eine Art Website im Spiel) Genau darauf möchte der Clan Member nur ungern verzichten. Damit der Download aber funktioniert, bedarf es einem Direct Link, den es auf Filehostern selten gibt, und wenn es ihn gibt, ist der Speed katastophal…
Allerdings ist es dem Member egal, ob die Mod auch von einem Multiplayer-Server aus verfügbar ist oder nur über den ManiaLink, hauptsache letzteres :wink:

Meine Idee, die ich dazu hatte:
Auf dem Webspace gibt es 2 Dateien: Zum einen die Mod selbst, nennen wir diese „Mod.zip“. Zum anderen das Script „download.php“.
Dieses Script soll nun bei Aufruf die Mod liefern, allerdings ihren Namen vor der Übertragung in „Doofkopp.zip“ (oder so :ps: ) umändern.
Somit würde sich das Spiel die falsche URL merken (eben die URL zu Doofkopp.zip), sodass beim späteren Einbau in eine Strecke die ganzen Serveranfragen ins leere laufen. (Diese Anfragen waren der Grund, weshalb ich die Mod entfernen musste.) Dass sich das Spiel die URL merkt, lässt sich leider nicht verhindern…

Nun meine Fragen:
[ol][li]Wäre das theoretisch möglich, dass das Script den Namen vor dem Ausliefern verändert?[/li]
[li]Wäre es auch praktisch möglich? Heißt, ist sowas auf bplaced erlaubt? (Lieber auf Nummer sicher gehen ^__^)[/li]
[li]Die eigentliche Frage: Kann mir jemand ein entsprechendes Script basteln? Ich kenn mich zwar einigermaßen in PHP aus, aber das übersteigt leider mein Wissen…[/li][/ol]

Würde mich sehr freuen, wenn ich eine entsprechende Antwort bekommen könnte :slight_smile:
(Es gibt sicher Leute hier, die so ein Script locker aus dem ärmel schütteln können, oder? :smiley: )

MfG FunTracker

Das geht nur, wenn sich das Game den Dateinamen merkt, was ich aber bezweifle…

aber eine Weiterleiung wäre vll. möglich…so, dass alle Anfragen auf einen zufälligen Dateinamen umgeleitet werden (also Redirect an Game gesandt), und auf zB. Mod123456789.zip umgeleitet
Dann könnte es sein, dass sich das Game die neue Adresse merkt, welche danach geblockt werden kann…

Da bin ich mir nicht sicher, ob sich das Game nun den dateinamen merkt, oder den Namen des Scriptes, das aufgerufen wird.

Im letzteren Fall müsste es aber eigentlich möglich sein, durch Übergabe eines Zeitstempels an das Script die aktuelle Zeit mitzuteilen, quasi “download.php?time=Datum_Uhrzeit”. Somit müsste sich das SPiel dann theoretisch auch diesen Parameter mit merken, und im Script kann ich die Zeit dann auf Gültigkeit prüfen (TimeOut von 5 Minuten oder so)

Wäre doch dann möglich, oder? Nur müsste ich in dem Fall auch das Zip im Script zurückliefern (diesmal ginbge auch ohne umbenennen vorher), was letztendlich mein problem ist :wink:

(Das TimeOut kann ich dann auch alleine einbauen :wink:)

Im ersteren Fall würde deine Weiterleitung greifen: Wenn eben der Dateiname gespeichert wird, braucht man nur einen falschen speichern zu lassen :wink:

EDIT: Wo ich grad drüber nachdenke: Da sich das Spiel die komplette URL merkt, müsste ich wohl den Fall mit der Zeitangabe nehmen… Bräuchte ich nurnoch ein entsprechendes Script, was das Zip liefern könnte ^^

Nun, man kann die (UTC)-Zeitangabe als GET-Parameter an die URI
eines PHP-Skriptes anhängen.
Das PHP-Skript prüft die Zeit und rückt per readfile im
korrekten Falle die Datei heraus, sonst eben nicht.

Hatte ich mal - allerdings mit verschlüsselten Zeitangaben -
bei einer Bildergalerie im Betrieb, um zu vermeiden, daß
andere Leute die Bilder referenzieren.

Wenn die Datei mit dem Verweis auch per PHP erzeugt wird,
ist die Ver- und Endschlüsselung ja kein Problem, solange niemand
sonst den Algorithmus kennt, mit dem verschlüsselt wurde.

Mir geht es ja nicht um die Übergabe der Zeit un d ähnliches, sondern wie ich dem Script sagen muss, dass es eben die Mod.zip liefern soll und so tun soll, als wäre es eben dieses Zip-File (damit auch alles im Spiel funzt) :wink:

prüfe mal bitte, ob das Game auch Umleitungen akzeptiert…

<?php
header("Location http://neue.domain.dt/datei.ext");

[quote=“michi7x7”]prüfe mal bitte, ob das Game auch Umleitungen akzeptiert…

[code]

<?php header("Location http://neue.domain.dt/datei.ext"); [/code][/quote] Nein, dann kommt der Fehler "Keine Daten empfangen"...

mist…geht das nicht auch anders???

Im PHP-Handbuch steht bei der header-Funktion direkt ein
Beispiel, content-type muß man natürlich korrekt angeben und
einen Dateinamen kann man auch vorschlagen.

de3.php.net/manual/de/function.header.php

Bei einem header mit Weiterleitung ist ja der Haken, daß die
Datei dann immer noch unter einer bekannten URI verfügbar
ist. Ein schlaues Programm könnte sich einfach die Weiterleitung
merken und gleich oder bei Mißerfolg zur statischen URI
wechseln (keine Ahnung, welche Programme das wirklich machen).

Das Beispiel sieht schonmal vielversprechend aus. Danke für den Link :slight_smile:

Werde es mal auf diesem Weg probieren, mal schauen ob es so funzt ^^

Danke schonmal für eure Beteiligung, hätte nicht erwartet, dass ich so schnell Antworten bekommen würde :stuck_out_tongue:

um das merken der URL geht es ja…
immer den aktuellen Timestamp mitgeben zu müssen kommt mir reichlich blöd vor…aber mit einer ID ginge es auch

/get_mod.php?2234512346234723452356374523452346457423452356
session_start();
session_id($_SERVER["QUERY_STRING"]);

if(empty($_SESSION['set']))
{
   $_SESSION['set']=true;
   header("content-type: application/octet-stream");
   header("Content-Disposition: attachment; filename='mod.zip'");
   readfile("mod.zip");
}

Danke nochmal, es funktioniert jetzt soweit :slight_smile:

@ michi: Hab den Weg über die Zeit genommen, war für mich einfacher zu machen ^^ (Und ob nun die Zeit oder die Zahlencombo übergeben wird dürfte eigentlich egal sein)

Nur ein Problem habe ich noch:
Wenn ich das zip nun downloade, bekommt das Spiel keine Information über die Größe des zips. Habe es dann mal über den Browser versucht, und auch da erhalte ich keine Größenangabe.
Muss da noch etwas mit in die Headers rein?
Momentan sieht es so aus:

[code] header(“Content-Type: application/zip”);
header(“Content-Disposition: attachment; filename=”{$file}"");

readfile($folder.$file);[/code]

Wobei $file und $folder jeweils Datei bzw Ordner enthalten, sollte alles richtig so sein. (Vorher findet noch der Gültigkeitscheck statt)

Denn es ist etwas verwirrend, wenn die Datei geladen wird, aber kein Ladebalken (im Spiel) dargestellt werden kann, weil eben die Größe unbekannt ist.
Weiß jemand Rat?

(Notfalls lass ich es so, ein entsprechender Hinweis sollte auch helfen)

header("content-lenght: ".filesize("mod.zip"));

:wink:

Vielen Dank michi, nachdem ich es zu „Length“ korrigiert habe, funktioniert es jetzt wunderbar :slight_smile: Vielen vielen Dank, ihr habt mir wirklich weitergeholfen :hail: