PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit copy();



LogicalLimit
19.10.2004, 10:06
Hi!
Ich habe ein kleines Problem mit der copy();-funktion!
Der user soll auf meiner Seite Bilder hochladen können, die alle das selbe Namen-Schema haben und im selben ordner sind.
z.B. wählt man die Datei "C:\Kamera\IMAG0001.JPG" über ein file-input aus und gibt in 3 text-inputs Prefix ("IMAG"), Suffix (".JPG") und Anzahl der Zahlenstellen (4) an. Zudem natürlich um wieviele Bilder es sich handelt.
Mein script generiert aus den Informationen dann auch die ganzen Pfade! Das funktioniert!
"C:\Kamera\IMAG0001.JPG"
"C:\Kamera\IMAG0002.JPG"
"C:\Kamera\IMAG0003.JPG"
"C:\Kamera\IMAG0004.JPG"
"C:\Kamera\IMAG0005.JPG"
Die Pfade werden generiert. Alles richtig, die Bilder gibts auch!
Dann kommt der copy-Befehl:
copy("C:\Kamera\IMAG0001.JPG", "/img/gallery/test/1.jpg");
Wie gesagt: Die datei C:\Kamera\IMAG0001.JPG existiert definitiv und der Ordner "img/gallery/test/" wurde kurz vor dem kopieren angelegt.
Aber trotzdem meldet php:
Warning: copy(C:\Kamera\IMAG0001.JPG): failed to open stream: No such file or directory

Ich weiss einfach nicht worans liegt. Habe den Ordner auch CHMOD 777 gegeben - trotzdem der Fehler!
Woran liegts? Bitte helft mir :D

Gruß, Alex

Cyber
19.10.2004, 11:39
Mal so ganz spontan: Vielleicht den Backslash selbst nicmal casten, also "C:\\Kamera\\IMAG0001.JPG" anstelle von "C:\Kamera\IMAG0001.JPG". Zweite Frage: Stimmt die Gross- und Kleinschreibung der generierten Dateien/Verzeichnisse mit den tatsöchlichen überein?

LogicalLimit
19.10.2004, 11:59
Hi!
Ja, die groß/klein schreibung ist so korrekt!
Der User gibt den Pfad zur ersten Datei ja manuell über ein <input type="file"> an. Das mit den doppelten Schrägstrichen verstehe ich nicht, aber ich versuchs mal ^_^

Vielen Dank, Gruß
Alex

LogicalLimit
19.10.2004, 12:08
Ich nochmal... :)
Habe jetzt den Fehler gefunden! Habe dummerweise im <form-tag das "enctype="multipart/form-data"" vergessen -.-
Jetzt findet er die Dateien schonmal! :D
Und zack, gibts ein neues Problem:

Warning: copy(): open_basedir restriction in effect. File(/tIMAG0001.JPG) is not within the allowed path(s): (/www/htdocs/ich/:/tmp:/usr/bin:/www/htdocs/ich:/bin:/usr/local/bin:/usr/share/php)

Merkwürdig ist allein schon, dass die datei jetzt /t vor dem Namen hat! Jetzt bin ich wirklich verwirrt!

Weiss jemand woran das liegt und was das bedeutet? :D
Danke im Vorraus

fossy
19.10.2004, 12:12
...
copy("C:\Kamera\IMAG0001.JPG", "/img/gallery/test/1.jpg");
...
Warning: copy(C:\Kamera\IMAG0001.JPG): failed to open stream: No such file or directory
...

entweder du bist in windows (backslash) _oder_ in un*x (slash). Unter Un*i gibt es kein C:

da musst du schon copy("/windows_mount_path/Kamera/IMAG0001.JPG", "/img/gallery/test/1.jpg"); nehmen.

gruss, fossy.

LogicalLimit
19.10.2004, 12:28
Hm, nicht ganz! Ich habe die Seite zwar unter Linux geschrieben, aber da die meißten meiner User Windows und den IE benutzen muss ich zum Testen der Seite natürlich auch Windows benutzen!
Und der Pfad wird ja wie gesagt vom User selbst übergeben.
Ich hatte, bevor ich das mit dem enctype angegeben habe in der Variablen $gpath den kompletten Pfad der Datei auf dem PC des users gehabt. Jetzt wo ich den enctype angegeben habe, steht in der Variablen "/tmp/phpeEApEA"!
Das erklärt jetzt auch das /t vor dem Dateinamen. Ich poste mal die routine wie aus einem Dateipfad, Pre- nud Suffix und die Stellenanzahl der Dateien die einzelnen Dateien herausgefunden werden:

$gname ist der Name der Gallery die erstellt werden soll.
$piccount ist die Anzahl der Bilder im Ordner.
$gpre ist das Prefix
$gsuf ist das Suffix
$gpath ist eigentlich der Pfad zur ersten Datei ("C:\Kamera\IMAG0001.JPG")
$gstellen ist die Anzahl der vorkommenden Zahlen

code:

function nullen($zahl, $format){
$tmp = $zahl;
$fehlend=$format-strlen($tmp);
for($t=1; $t<=$fehlend; $t++){
$tmp="0".$tmp;
}
return $tmp;
}


$abschnitt=strlen($gpre)+strlen($gsuf)+$gstellen;
$pfad = substr($gpath, 0, strlen($gpath)-$abschnitt);
mkdir("img/gallery/$gname");
for($p=1; $p<=$piccount; $p++){
$pfad2=$pfad . $gpre . nullen($p, $gstellen) . $gsuf;
//bild $p kopieren
copy("$pfad2", "img/galery/$gname/$p.jpg");
}


Wenn in $gpath jetzt der ganze Pfad ist, kommt alles so hin wie ich mir das gedacht habe. Aber jetzt hat $gpath ja so einen komischen wert und ich weiss nicht wie ich das ändern kann!

Vielen dank, gruß
Alex

Xanti
19.10.2004, 16:19
Steht in $gpath "/tmp/phpeEApEA" oder "/tmp/phpeEApEA/IMAG0001.JPG"?

Gruss, Phorus

LogicalLimit
19.10.2004, 16:33
Habe es mir gerade mehr mals ausgeben lassen!
Da steht immer etwas anderes.
Mal "/tmp/php2wjkBv", mal "/tmp/phpzzIOYB" und mal ganz was anderes o.O
Aber das IMAG0001.JPG steht da nicht.

Xanti
19.10.2004, 16:51
Kannst Du mal bitte den Programmteil zeigen, in dem Du diese $gpath erhälst. Ich denke, in /tmp/xxx befindet sich eine lokale Kopie von IMAG001.JPG. Dann würde es auch einfach ein


copy("$gpath", "img/...")

tun, ohne das Primborium drumherum.

LogicalLimit
19.10.2004, 16:57
$gpath wird halt in nem ganz normalen Formular eingegeben:



<form action="?" method="post" enctype="multipart/form-data">
<table border="0">
<tr>
<td>Name der Gallery</td>
<td><input type="text" name="gname"></td>
</tr>
<tr>
<td>Anzahl der Bilder</td>
<td><input type="text" name="piccount"></td>
</tr>
<tr>
<td>Speicherort</td>
<td><input type="file" name="gpath"></td>
</tr>
<tr>
<td>Prefix</td>
<td><input type="text" name="gpre"></td>
</tr>
<tr>
<td>Zahlenstellen</td>
<td><input type="text" name="gstellen"></td>
</tr>
<tr>
<td>Suffix</td>
<td><input type="text" name="gsuf"></td>
</tr>
</table>
<input type="submit">
</form>


Da bekommt $gpath den komischen Wert!
Klar, mit copy($gpath, "img/gallery...bla"); würde das script diese eine angegebene Datei hochladen!
Aber es soll ja eine Gallery entstehen und der User soll nicht jedes Bild einzeln hochladen müssen. Dafür ist ja das "gedöns" da, das aus dem einen Dateipfad, beliebig viele neue zaubern sollte.

Xanti
19.10.2004, 17:28
Du musst gpath als type=text einlesen, dann in die einzelnen Filenamen zusammenbauen (das Gedönse) ;), und dann die Files uploaden (http://de2.php.net/manual/de/features.file-upload.multiple.php).

Gruss, Phorus

LogicalLimit
19.10.2004, 17:36
Ja, so würde es gehen, aber ich hätte doch gerne so nen Knopf "Durchsuchen" Womit man den Pfad als User leichter finden kann! Gibts da n Trick? :) Ich dachte mir schon sowas mit javascript, dass beim type=file-viech so ein onchange kommt, dass einem type=hidden-viech einen Wertübergibt - halt den Pfad!
Aber leider bin ich abslut kein js-Profi ^^

Xanti
19.10.2004, 17:43
Bin leider auch kein js-Profi :)

LogicalLimit
19.10.2004, 18:11
Schade, aber man kann wohl nich alles haben ^_^
Habe mal das hier versucht:


<form action=\"?\" method=\"post\" enctype=\"multipart/form-data\" name=\"addgal\" id=\"addgal\" OnSubmit=\"javascript: document.addgal.gpath2.value=test;\">
...
<input type=\"file\" name=\"gpath\"><input type=\"hidden\" name=\"gpath2\">
...


Aber so funzts nich :( Wie ich mich kenne hab ich irgend ein semikolon, ein Komma oder ne Klammer vergessen, aber wie gesagt; bin kein Profi :]