Zippen vor dem download, geht das?

Tach zusammen,
wie wo und was ich mache? siehe hier -> klick

Seite: Seite von Hase

So, und jetz zu meinem Problem:

Ich lasse über ein .php script datein und ordner aufm server auslesen und verlinken. Da ich in dem script keinen mimetype prüfen lassen kann hab ich das problem, dass mir beim anklicken verschiedenser daten wie .pptx oder .docx entweder datensalat oder ein 404 html error präsentiert wird. Meine Idee das zu umgehen waere gewesen (so wie der IE es standartmäßig bei einigen dateitypen macht) die datein serverseitig als *.zip an den browser zu senden, ohne das ich sie als .zip hochladen muss.

Gibts da moeglichkeiten sowas zu realisieren ohne an die grenzen der auf bplaced aktivierten php funktionen zu stoßen?

LG und Danke schonmal im voraus …

Aber natürlich doch :wink:
steht alles hier: at.php.net/zip

Warscheinlich wird das für dich aber nichtmal notwendig sein. Möglicherweise reicht ja schon das:

<?php
header('Content-type: application/octet-stream');

header('Content-Disposition: attachment; filename="datei.pptx"');

readfile('orginaldatei')

egal wie die Orginaldatei heißt, bekommt der Browser sie als datei.pptx gesendet. Als MIME-Typ bekommt er application/octet-stream, was als undefinierter Dateityp zu werten ist :wink:

Sofern zu den Formaten bei IANA ein ‘Content-Type’, ehemals
’MIME-Type’ angemeldet ist, kann man den doch verwenden,
entweder dann - sofern der server den nicht bereits selber kennt -
per .htaccess für alle Dateien mit gleicher Endung angeben oder
eben bei jeder Datei einzeln per PHP.
Bei einigen experimentellen Formaten haben sich auch
vorläufige Typen etabliert, erkennt man dann am ‘x-’ im Subtyp.
Besser natürlich, man setzt gleich von vorne herein auf
Standardformate, für die gibt es eigentlich einen angemeldeten
Typ ;o)

Wenn es sich um komprimierte oder Container-Formate handelt,
ist es ja überflüssig, die mit zip oder gzip nochmal einzupacken.

Wir sind erstmal so weit:

download.php:

[code]

<?php $f = "./files/".$_GET['file']; $f = str_replace("..", "", $f); $zip = new ZipArchive(); $z = $f.".zip"; $zip->open($z, ZIPARCHIVE::CREATE) OR exit; $zip->addFile($f); $zip->close(); header("content-type: application/zip"); header("Content-Disposition: attachment; filename=\"$z\""); readfile($z); unlink($z);[/code] und die Index: [code] <?php $d = "./files/".$_GET['dir']."/"; //Pfad darf nicht eine Ebene höher gewechselt werden! $d = str_replace("..", "", $d); $scan = scandir($dir); $files = $dirs = array(); foreach($scan as $f) { if($f[0] == "."); //Wenn erstes Zeichen "." überspringen elseif(is_dir($d.$f)) $dirs[] = $f; else $files[] = $f; } foreach($dirs as $f) echo "[DIR]$f
"; foreach($files as $f) echo "$f
"; [/code]

[quote=“michi7x7”]Wir sind erstmal so weit:

download.php:

[code]

<?php $f = "./files/".$_GET['file']; $f = str_replace("..", "", $f); $zip = new ZipArchive(); $z = $f.".zip"; $zip->open($z, ZIPARCHIVE::CREATE) OR exit; $zip->addFile($f); $zip->close(); header("content-type: application/zip"); header("Content-Disposition: attachment; filename=\"$z\""); readfile($z); unlink($z);[/code] [/quote] Jaein, also die dl.php stimmt, aber die index läuft noch mit nem andren script :stuck_out_tongue: Das bei verlinkung -> .zip -> download klappt, sind nur noch ein paar schoenheitsfehler zu verbessern ;D

Aja, die Ordnerstruktur in der ZIP…

Das:

in das umändern:

at2.php.net/basename :wink:

Mein Verzeichnisskript macht eig. auch genau das gleiche wie deiner, nur er verhindert, dass als Pfad “…” angegeben wird, was zur Folge hätte, dass der User das Übergeordnete Verzeichnis aufgelistet bekommt :wink:

Das wechseln in das übergeordnete Verzeichnis des aktuell angezeigten müsste man nur noch implementieren:

Also das downloaden in zip archiven geht jetz wunderbar, keine unnoetigen ordner mehr, keine ueberflüssigen archive aufm server, allerdings:

Der IE ist der eintige browser der wiedermal rumspackt -.-
versucht man ein archiv, vor allem aber die .docx datein, herunter zu laden packt er sie ordnungsgemaeß ein und uebertraegt sie, aber beim oeffnen wird gemeldet archiv zerstoert =/

Kann man da was machen? =/

LG Hase

Da anscheinend niemand mehr eine Idee hat noch eine randbemerkung:

Das, was michi7x7 als index gepostet hat, funktioniert nicht.

[code]
Warning: scandir() [function.scandir]: Directory name cannot be empty in /users/gymsan/www/School/Biologie/test2.php on line 58

Warning: Invalid argument supplied for foreach() in /users/gymsan/www/School/Biologie/test2.php on line 61 [/code]

Ist die ausgabe der browser zu dem thema …

hab da einen kleinen Fehler gemacht…
Einfach das:

Durch das ersetzen:

bewirkt keinerlei statusaenderung … immernoch Fehlermeldungen wie die geposteten :frowning:

LG Hase

€:

<?php
$d = "./files/".$_GET['dir']."/";
							
//Pfad darf nicht eine Ebene höher gewechselt werden!
$d = str_replace("..", "", $d);
		
$scan = scandir($d);
$files = $d = array();
					
foreach($scan as $f)
{
if($f[0] == "."); //Wenn erstes Zeichen "." überspringen
elseif(is_dir($d.$f)) $dirs[] = $f;
  else $files[] = $f;
							}
							
foreach($dirs as $f)
		   echo "<a href='$_SERVER[PHP_SELF]?dir=$d$f'>[DIR]$f</a><br />";
					
foreach($files as $f)
		   echo "<a href='download.php?file=$d$f'>$f</a><br />";
?>

Das steht jetzt in meiner .php datei so drin, vllt hilft das bei der fehlerfindung :wink:

also bei mir geht das:

[code]

<?php $d = "./files/".$_GET['dir']."/"; //Hier Pfad einsetzen! //$d = "./".$_GET['dir']."/"; //So geht es ohne Pfad //Pfad darf nicht eine Ebene höher gewechselt werden! $d = str_replace("..", "", $d); $scan = scandir($d); $files = $dirs = array(); foreach($scan as $f) { if($f[0] == "."); //Wenn erstes Zeichen "." überspringen elseif(is_dir($d.$f)) $dirs[] = $f; else $files[] = $f; } foreach($dirs as $f) echo "[DIR]$f
"; foreach($files as $f) echo "$f
";[/code] Du musst nur in der ersten Zeile den richtigen Pfad einsetzen :wink:

Gut, also es liegt nicht am auslesenden script =/ auch mit deiner variante habe ich das problem, dass die runetrgeladenen archive via IE korrupt sind. Könnte das vllt an dem script in der download.php liegen? eine andere erklärung hab ich naemlich mitlerweile wirklich nicht mehr -.-

LG Hase

Im Firefox funktionieren sie? Dann ist das ein Fehler des IE…
Im Fehlerfall ist das Archiv 0Byte groß :wink:

//EDIT: Der Fehler liegt wieder mal in meiner Annahme, dass die Dateien in einem Unterverzeichnis liegen:

wird zu

school.gymsan.bplaced.net/Biologie/test.php

Überzeuge dich selbst, in den IE 6 & 7 bekommst du entweder datenmuell oder zip archive mit zerstoerter crc32 summe … ergo: nicht nutzbare datein.

In allen anderen Browsern funktioniert das tadellos =)

(der IE produziert bei allen dateitypen schrott, nichtnur bei der .docx :neutral_face: )

vielleicht geht es, wenn man die Dateigröße mitgibt…

dazu musst du nur einen header mehr senden:

einfach nach den anderen 2 headern einfügen :wink:

Leider keine aenderung :frowning:

Also, es funktioniert definitiv für: Opera 9.63, Mozilla Firefox (aktuellste Ver.), Safari 4 (allerdings Darstellungsprobleme :neutral_face: )

Es funktioniert NICHT bei: IE 6/7, Avant Browser

Trotzdem nocheinmal Danke für deine Bemuehungen, ich denke, ich werde die User vom IE darauf hinweisen, dass seine Benutzung zu datenmuell fuehrt und es damit auf sich beruhen lassen muessen :confused:

LG Hase