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.
Zobrazeno 7 zpráv z 7.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.