Ziel speichern unter problem

Aerzte1992

Grünschnabel
Hy Com.

nach langem hin und her, und literweise hirnschmalz bin ich schon am Verzweifeln. Die Aufgabe ist ganz einfach. Daten hochladen, den ordner auslesen, in ein Array speichern, sortieren und per Ziel speichern unter.. downloaden

Script von der Upload seite:
PHP:
$pfad1 = "Upload";



$files     = array();
$dir    = opendir($pfad1);
while(false !== ($file = readdir($dir))){
    if(!preg_match('/^\.{1,2}$/',$file)){
        $files[] = $file;
       ksort($files);
       $_SESSION['array'] = $files;
    }else{
        continue;
    }
}
closedir($dir);
asort($files);

ksort($files);
foreach($files as $v){

$zähler = count($files);
$zahl = intval($zähler); 

if(!isset($wert) or $wert<= $zahl)// diese Anweisung dient rein nur für einen Wert, der später als GET aufgerufen wird
{
++$wert;
echo $wert;

$name= "$v</a><br>\n";//
 echo "<table border=\"4\"><colgroup><col width=\"400\"><tr><th align = \"center\">".$name."<br></th><th>";?> <html><body><a href="Upload/download.php?what=<?php echo $wert; ?>">/Upload/<?php echo $v; ?></a> </body></html> <?php echo "</th></tr></table></p>";
?>

<?php
}
}
print_r($_SESSION['array']);
echo '<input type="submit" value="go"></form>';
?>
p.s. dieses php file wird mit include eingeladen. Deswegen steht auch zu Begin kein session start.

klickt man nun auf den link, sollte das speichern unter aufgerufen werden.

hier das download sript
PHP:
<?php session_start();



for ($zahl = 1; $zahl <= count($_SESSION['array']); $a[] = $zahl++)
{

}
//Grund für das combinieren des array mit dem inhalt der for schleife ist, das der array inhalt von der upload seite mit 1 statt 0 beginnt. 
$c = array_combine($a, $_SESSION['array']);
ksort($c);

$filename = $c[$_GET[what]];

header("Content-Type: x-type/subtype");
header("Content-Length: ".filesize($filename));
header("Content-Disposition: attachment; filename=".$c[$_GET[what]]);
readfile($filename);
?>

nun mein Problem: offline erscheint zwar das Ziel speichern unter Feld, aber lade ich mir eine txt oder doc. datei herunter steht ne fehlermeldung drinnen, die nicht nachvollziehbar ist. der restliche text fehlt. Ausderem seht nicht der Dateiname sondern download.php im Downloadfenster.(z.b. statt 1.png)
Versuch ich das ganze online, erscheint kein fenster, sondern ich werde zu ner leeren seite weitergelitet.

Code:
<b>Notice</b>:  Undefined index: array in <b>C:\xampp\htdocs\Upload\download.php</b> on line <b>3</b><br />
<br />
<b>Notice</b>:  Undefined variable: a in <b>C:\xampp\htdocs\Upload\download.php</b> on line <b>6</b><br />
<br />
<b>Notice</b>:  Undefined index: array in <b>C:\xampp\htdocs\Upload\download.php</b> on line <b>6</b><br />
<br />
<b>Warning</b>:  array_combine() expects parameter 1 to be array, null given in <b>C:\xampp\htdocs\Upload\download.php</b> on line <b>6</b><br />
<br />
<b>Warning</b>:  ksort() expects parameter 1 to be array, null given in <b>C:\xampp\htdocs\Upload\download.php</b> on line <b>7</b><br />
<br />
<b>Notice</b>:  Use of undefined constant what - assumed 'what' in <b>C:\xampp\htdocs\Upload\download.php</b> on line <b>9</b><br />
<br />
<b>Notice</b>:  Use of undefined constant what - assumed 'what' in <b>C:\xampp\htdocs\Upload\download.php</b> on line <b>14</b><br />
<br />
<b>Warning</b>:  readfile() [<a href='function.readfile'>function.readfile</a>]: Filename cannot be empty in <b>C:\xampp\htdocs\Upload\download.php</b> on line <b>15</b><br />

Der Fehlercode, der sich automatisch in die Text Datei schreibt:
 
Grüße,

immer mit der Ruhe - irgendjemand wird sich das hier immer anschauen und versuchen zu helfen....

Also mal zu deinem Problem - das ganze dürfte sich an den 2 Stellen hier befinden:

PHP:
header("Content-Disposition: attachment; filename=".$c[$_GET[what]]);
$filename = $c[$_GET[what]];

Wenn du damit ne URL auslesen willst, die so aussieht: http://www.test.de?what=12345,
dann wird das an sich nicht funktionieren.

Ändere das mal so ab:
PHP:
header("Content-Disposition: attachment; filename=".$c[$_GET['what']]);
$filename = $c[$_GET['what']];

Die For-Schleife ist mir persönlich auch ein Rätsel - wäre nett, wenn du mal erklären würdest, was die genau machen soll.
Weiterhin gefällt dem Interpreter nicht, dass die Variablen 'a' und 'filename' nirgends initialisiert werden und dass 'c' nach dem Einsatz von array_combine leer ist, weshalb auch ksort nicht funktioniert.
 
Vielen Dank erst mal, ich in schon am Verzweifeln und bin über jede Antwrt glücklich. die if funktion dient nur zur nummern vergabe. Ein link des Array sollte wenn möglich so aussehen:
HTML:
<a href="download.php?what=1">test.zip</a><BR>
wenn ich das nun zerlege, klappt alles so weit, bis zu what=1. Diesen Wert muss ich dort mittel variable einfügen, da er sich verändert. Je mehr datein zum download angeboten sind, desto höher muss dieser wert sein. Das endergebniss liegt in einer Tabelle und soll so aussehen: (angenommen es befinden sich 3 Bilder zum Donwload) Das Array $files wird aufeglistet und dazu der entsprechene Downloadlink:
Bild1.jpg.......what=1
Bild2.jpg.......what=2
Bild3.jpg.......what=3
Dieser "what"-Wert muss auch an die 2 seite übergeben werden, damit auch das richtige Bild gedownloaded wird. d.h. $_GET[what] muss identisch mit diesen Zahlen sein, ansonsten wird bei klick auf Bild1.jpg ev. Bild2.jpg zum Download angeboten.
Kurz noch zur If-Abfrage... Natürlich verwendet man normalerweise eine for-Schleife in der man den count-Wert des ausgelesenen(denk ich mir), jedoch hab ich dan folgendes Problem: Die Auflistung des Links muss in der SChleife erfolgen und damit verbunden auch die Auflistung der Dateinamen(siehe oben, Bild1.jpg, Bild2.jpg, usw). Würde ich die auflsitung in der Schleife tätigen, sieht das ergebnis so aus:
Bild1.jpg.......what=1
Bild1.jpg.......what=2
Bild1.jpg.......what=3
Bild2.jpg.......what=1
Bild2.jpg.......what=2
usw.

Da ich der Schleife nicht sagen kann, "tu den Wert 1 nur zum ersten Array eintrag und den wert 2 zum nächsten Array eintrag", stellt mir die schleife jedes Array mit jeden wert hin. Zählt die Schleife nun bis 3, wären das bei 3 Array Einträgen, insgesamt 9 Ausgaben. Würde ich die Link + what=" " ausgabe außerhalb der for Schleife schreiben, nimmt what="" den letzten WErt der Schleife an, indemfall wäre das 3, wenn die Schleife bis 3 zählt. Ergebnis wäre demnach
Bild1.jpg.......what=3 //es müsste aber 1 sein
Bild2.jpg.......what=3// es müsste aber 2 sein
Bild3.jpg.......what=3// hier passt es, da es die summer der Array Einträge ist, und damit nr.3

Leider viel zu lesen. ich hoffe es ist nicht allzu sehr verwirrend.
danke nochmals
 
danke, dank dir funtktioniert nun auch der download. hab die if und for schleife bzw. anweisung gelassen.

letzte Frage wäre bezügl. movie_uploaded_file. Das php script liegt im Ordner "Upload".In diesem Ordner liegt der Ordner "schule". Dort hinein sollen die daten geschoben werden. Die sich vor dem verschieben gemeinsam mit dem Ordner Schule, im Ordner Upload befinden
ich möchte nurdie daten in einen unterornerverschieben und von dort auslesen lassen, um die vielen homepage files nicht anzuzeigen. ordnung ist das halbe leben.
so sieht das script aus:
PHP:
<?php

$tempname = $_FILES['file']['tmp_name'];
move_uploaded_file("$tempname", "/Schule/$name");

$name = $_FILES['file']['name'];


$type = $_FILES['file']['type'];
$size = $_FILES['file']['size'];


$dateiname=$_FILES['file']['name'];

             if (preg_match('/\.(?:pdf|xls|docx?|mp3|tex)$/i', $filename)) {
    $err[] = "<font color = \"blue\"><br>Nur gif, jpeg, doc, docx ,pdf und mp3 dürfen hochgeladen werden.</br></font>";
}
echo "<br><font color = \" red\">Bereits hochgeladene Datein mit dem gleichen Dateinamen wie Ihre, werden durch Ihre Datei ersetzt!</font></br>";
if($size > "150000000") {
    $err[] = "<br>Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 15 KB!<br>";
}
if(empty($err)) {
    copy("$tempname", "$name");//Zeile 110
    echo "<br><font color=\"green\">Die Datei $name wurde erfolgreich hochgeladen! Zum Aktualisieren bitte auf Download-Upload klicken.</font><br>";
}
else {
    foreach($err as $error)
    echo "$error<br>";
}
und das ist die fehlermeldung:
Code:
beim auflisten:Warning: copy() [function.copy]: Unable to access in /srv/www/httpd/phost/a/at/pytalhost/aura/web/Upload/d-u.php on line 110
Nachdem der Button hochladen, beim upload gedrückt wurde:Warning: move_uploaded_file() [function.move-uploaded-file]: SAFE MODE Restriction in effect. The script whose uid is 33 is not allowed to access / owned by uid 0 in /srv/www/httpd/phost/a/at/pytalhost/aura/web/Upload/d-u.php on line 91
 
ok... copy und move in einem script verträgt sich nicht so gut. habe die copy durch movie ersetzt, dort die automatischen variablen, wie temp_name usw. hineingegeben und es funktioniert zurzeit
 
wieder ein letztes Problem leider:(

alles funktioniert so wie es soll, aber wenn ich daten upload, die leerzeichen in ihrem dateinamen haben, wird beim Download eine datei mit *.doc endung angeboten, die den namen bis zum ersten Leerzeichen hat. speichere ich diese Datei, hat sie nur 3,5kb und geht nicht zum öffnen. :-(

Bsp.
Center.tex --> funktioniert.
latex Center.tex --> beim download: latex.doc geht nicht zum öffnen

bild.png --> funktioniert
garten bild --> funktioniert nicht, dateiname beim download:garten.doc
 
Öffne diese 3,5kb-Datei doch mal in einem anderen Editor z.B. Notepad++ oder einem anderen (nicht Windows Notepad). Da sollte vermutlich der Fehler in der Datei drin stehen. Den kannst du hier posten, vllt. kann man dann mehr sagen.
 
der Inhalt stimmt mit meinen Text überein und wenn ich die Datei händisch umändere stimmt sie auch, bis auf die umlaute, die im Text auf ?! udgl. umgeändert werden. ****? wie kann man das alles verhindern****
 
Entferne doch einfach bei jeder Datei alle Leerzeichen hiermit:
PHP:
$removed = str_replace(" ", "", $file);

Söllte dann so im Script funktionieren:
PHP:
<?php
$tempname = $_FILES['file']['tmp_name']; 
$name = str_replace(" ", "", $name);
move_uploaded_file("$tempname", "/Schule/$name"); 
...
?>
 
Zuletzt bearbeitet:
Zurück