Diskuze: Upload složky se zachováním její struktury (ssh2)
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zkousel jsi to zazipovat?
To vím, že by bylo možné, ale šlo mi o to, jestli existuje nějaká
možnost, jak to udělat bez toho... Abych ušetřil co nejvíce kroků
Ale v případě zipu by se pak jak změnil ten skript? A šlo by to pak odzipovat přes ssh2?
Díky!
Jenom obecná poznámka rozhodně není pravda, že pro použití fce
move_uploaded_file musíš nastavit oprávnění na 777. Je potřeba, aby ta
složka byla čitelná pro uživatele, který spuští php (většinou www-data
ve výchozím nastavení).
Ten zbytek asi takhe. Zamysli jestli opravdu potřebuješ to ssh pokud dobře
chápu tak pracuješ v rámci jednoho stroja a využití ssh mi přijde
divné.
Nesnažil bych se to rozbalovat pomocí php, ale pomocí bash scriptu (existuje
pěkná utilitka unzip dostupná pro většinu linuksových distribucí). Ten
bash script na rozbalení může při větším množství obrázků běžet
docela dlouho, takže bych se možná vykašlal na pokusy spustit to přímo z
php a místo toho bych to spustil třeba jako cron (pokud ti nevadí chvíli si
počkat). Pokud by jsi chtěl uploadovat nezabalenou složku tak budeš muset
vytvořit pro každý soubor všechny podsložky. Tím myslím toto vě složce
budeš mít soubor a/b/d/neco.txt a budeš ho chtít umístít do složky
/e/f/g/. Tak nejdřív musíš postupně vyvřit složky /e/f/g/a , /e/f/g/a/b ,
/e/f/g/a/b/d (pokud tyto složky již neexistují) a nakonec do složky
/e/f/g/a/b/d/ nakopíruješ soubor neco.txt. V bashi by to šlo vyřešit
jedním příkazem, ale v php asi budeš muset tohle udělat postupně pro
všecny soubory a všechny podsložky.
Díky moc za pomoc! Nakonec jsem to vyřešil následovně:
<?php
require'../src/config-ssh.php';
$url="new-package.php";
$deb_dir = "/var/www/html/debs/";
$depic_dir = "/var/www/html/depictions/";
if (!empty($_FILES["debFile"]["name"])) {
$debFile = $_FILES["debFile"]["tmp_name"];
$deb_file = $deb_dir . basename($_FILES["debFile"]["name"]);
if (!file_exists($deb_file)) {
ssh2_scp_send($ssh, $debFile, $deb_file, 0755);
echo nl2br ("DEB file ". basename( $_FILES["debFile"]["name"]). " has been uploaded.\n");
} else {
echo nl2br ("DEB file ". basename( $_FILES["debFile"]["name"]). " already exists!\n");
}
}
if (!empty($_FILES["depicDir"]["name"])) {
preg_match('/(.*)_(.*)_/', $_FILES["debFile"]["name"], $display);
$dirname = $display[1];
$createDepicDir = $depic_dir . $dirname;
$createScreenshotDir = $createDepicDir . "/screenshots";
$sftp = ssh2_sftp($ssh);
if (ssh2_sftp_mkdir($sftp, $createDepicDir)) {
echo nl2br ("Depiction folder ". $dirname. " has been created.\n");
}
if (ssh2_sftp_mkdir($sftp, $createScreenshotDir)) {
echo nl2br ("Screenshots folder ". $createScreenshotDir. " has been created.\n");
}
foreach ($_FILES['depicDir']['name'] as $i => $name) {
if (strlen($_FILES['depicDir']['name'][$i]) > 1) {
$depicDir = $_FILES["depicDir"]["tmp_name"][$i];
$info = getimagesize($_FILES['depicDir']['tmp_name'][$i]);
$depic_file = "$createDepicDir/" . basename($_FILES["depicDir"]["name"][$i]);
$screenshot_file = "$createScreenshotDir/" . basename($_FILES["depicDir"]["name"][$i]);
if (basename($_FILES["depicDir"]["name"][$i]) == "info.xml") {
ssh2_scp_send($ssh, $depicDir, $depic_file, 0755);
echo nl2br ("File ". basename( $_FILES["depicDir"]["name"][$i]). " has been uploaded.\n");
}
if ($info[2] === IMAGETYPE_PNG) {
ssh2_scp_send($ssh, $depicDir, $screenshot_file, 0755);
echo nl2br ("File ". basename( $_FILES["depicDir"]["name"][$i]). " has been uploaded.\n");
}
}
}
}
$stream = ssh2_exec($ssh, "/var/www/html/update.sh");
$errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
stream_set_blocking($errorStream, true);
stream_set_blocking($stream, true);
echo nl2br ("Output: " . stream_get_contents($stream));
echo nl2br ("Error: " . stream_get_contents($errorStream));
fclose($errorStream);
fclose($stream);
echo "<script>setTimeout(function(){location.href='".$url."'} , 5000);</script>";
exit();
?>
.. a vše funguje, jak má
Mno, mne prislo divne, ze by ti browser poskytoval celou strukturu na disku,
ale asi jo, kdyz ti to funguje. Proto bych to zipoval. A zip stahnes jako cely
soubor pres ssh a dal uz to rozbalujes beznymi prikazy nebo pres bash. Nebo,
aspon tak si to myslim, nikdy jsem to nezkousel.
No, a tez, bezne se ssh pouziva jako vrstva nad tim, takze soubor dostava soubor
ve files uz bez ssh. Takhle jsem to nikdy neresil, takze mi to prijde celkem
zajimave tema.
Jo, a jinak bych si na to udelal asi class nebo funkci nebo link na promenou, ktere predas obsah $FILES, abys to pak nemusel duplikovat a pri zmene jmena inputu pak cele prepisovat.
$dir_list = $_FILES["depicDir"];
$file_list = $_FILES["debFile"];
Zobrazeno 7 zpráv z 7.