Képek filenevének átnevezés

Képek filenevének átnevezés
2020-12-13T12:46:52+01:00
2020-12-14T20:52:28+01:00
2022-10-15T21:26:21+02:00
tivisu
Sziasztok,
a könyvtárban van 3 kép (lehet több is vagy kevesebb) és azok filenevei (elérési úttal együtt):
kepek/2020/1003/2020_1003_20_1_img_valamineveakepnek.jpg
kepek/2020/1003/2020_1003_20_1_img_valamimasneveakepnek.jpg
kepek/2020/1003/2020_1003_20_1_img_valamiharmadikneveakepnek.jpg

Ezeket a képeket kéne átneveznem azzal, hogy az "1"-es helyett kell más számot kapniuk. A változókban ezt a számot a $text_page adja meg.

A képek így lettek feltöltve, vagyis több file egyszerre:

$countfiles = count($_FILES['file']['name']); for ($i = 0; $i < $countfiles; $i++) { $filename = $_FILES['file']['name'][$i]; move_uploaded_file($_FILES['file']['tmp_name'][$i], './kepek/' . $user_txt_year . '/' . $user_txt_nr . '/' . $text_page . '/' . $user_txt_year . '_' . $user_txt_nr . '_' . $text_nr . '_' . $text_page . '_img_' . $filename); }
Valami ilyesmivel próbálkoztam átnevezni:

$files = glob('./kepek/2020/1003/2020_1003_20_1_img_*.{jpg, gif, png}', GLOB_BRACE); foreach ($files as $filename) { rename($file, './kepek/2020/1003/2020_1003_20_2_img_*.{jpg, gif, png}'); }
A képek átnevezésénél lesz olyan is, hogy könyvtárat kell váltanom, vagyis a kepek/2020/1003/ könyvátrból át kell a képeket helyeznem a kepek/2020/1003/6 könyvtárba. Ugyanúgy csak a "_img_" előtti számok fognak csak változni.
Előre is köszönöm.
T
Mutasd a teljes hozzászólást!
Hali!

Azt gondolom, talán értem a problémát. Itt egy függvény, ami bármelyik oldalról bármelyik oldalra átnevezi/mozgatja a fájlokat (a dokumentumokat is, amennyiben az oldalszám is benne van a névben):
function movePage(int $year, int $issueNr, int $textNr, int $toPage, int $fromPage = 0, string $base = './kepek') { $fromPath = "$base/$year/$issueNr/".($fromPage > 0 ? $fromPage."/" : ""); $toPath = "$base/$year/$issueNr/$toPage/"; // Mappa létrehozása @mkdir($toPath, 0644); // Fájlok mozgatása $movedFiles = 0; $filenameTemplate = "{$year}_{$issueNr}_{$textNr}_{$fromPage}*.{doc,docx,pdf,jpg,jpeg,png,gif}"; if (($files = glob($fromPath.$filenameTemplate, GLOB_BRACE)) !== false) { $pattern = '/^\d+_\d+_\d+_\d+_(.+)$/'; $replace = "{$year}_{$issueNr}_{$textNr}_{$toPage}_$1"; foreach ($files as $filename) { if (@rename($fromPath.$filename, $toPath.preg_replace($pattern, $replace, $filename))) { $movedFiles++; } } } return $movedFiles; }
A hívása, remélem, egyértelmű. Elvileg nincs benne hiba, de értelemszerűen nem tudtam tesztelni.

Mutasd a teljes hozzászólást!

  • Hali!

    A „könyvtárban van 3 kép (lehet több is vagy kevesebb) és azok filenevei (elérési úttal együtt)” példáknak némileg ellentmond a „képek így lettek feltöltve” kódod. Vagy csak rosszul adtad meg a példákat és a „kepek/2020/1003/” helyett „kepek/2020/1003/1/” a tényleges mappa – már ha tényleg azzal a kóddal töltöd fel?

    Ezeket a képeket kéne átneveznem azzal, hogy az "1"-es helyett kell más számot kapniuk. A változókban ezt a számot a $text_page adja meg.

    És ezt nem tudod megtenni egyből feltöltésnél? Vagy akkor nem ismert a $text_page változó?

    A képek átnevezésénél lesz olyan is, hogy könyvtárat kell váltanom, vagyis a kepek/2020/1003/ könyvátrból át kell a képeket helyeznem a kepek/2020/1003/6 könyvtárba. Ugyanúgy csak a "_img_" előtti számok fognak csak változni.

    Ez valami szabály alapján fog történni? Írd le pontosan, hogy mi alapján (akár példákkal illusztrálva, hogy miből mit szeretnél kapni, az milyen változóktól függ, stb.).

    Alapvetően nem más ez, mint egy sztring-csere (vagy cserék sorozata), amit akár reguláris kifejezések használatával is meg lehet oldani. Persze, ha pontosan ismert az, hogy miként szeretnéd.

    Mutasd a teljes hozzászólást!
  • Hát igen, amikor siet az ember :)

    A könyvtárstruktúra az a következő:
    1.) kepek - ahova az összes anyag kerül (doc filokkal együtt, de azok most nem fontosak, azokat megoldottam)
    2.) 2020 - év (értelemszerűen)
    3.) 1003 - az újság száma
    4.) 1, 2, 3, 4 ... - az újság oldalainak száma (ez az a bizonyos "1"-es és változik 2-re, ha a képet a második "oldalba", könyvátba kell másolni).

    tehát kepek/2020/1003/1/, kepek/2020/1003/2/, kepek/2020/1003/3/...

    És igaz, nem az "1"-essel kezdődik az egész, hanem "0"-val. Ugyanis, amig nem tudni, hogy a szöveg melyik oldalra kerül, addig "0" az érték. Ebben az eseben, amikor "0" az érték a fileok a
    kepek/2020/1003/ könyvtárban vannak, és akkor kerülnek át valamelyik számozottba, amikor eldől, hogy hova kerül a szöveg.

    Nagyjából így nézne ki, remélem érthető voltam most, sajnos, már magam is észrevettem, hogy nem mindig fogalmazok egyértelműen, ezért elnézést is kérek...
    Mutasd a teljes hozzászólást!
  • Hali!

    És igaz, nem az "1"-essel kezdődik az egész, hanem "0"-val. Ugyanis, amig nem tudni, hogy a szöveg melyik oldalra kerül, addig "0" az érték. Ebben az eseben, amikor "0" az érték a fileok a
    kepek/2020/1003/ könyvtárban vannak, és akkor kerülnek át valamelyik számozottba, amikor eldől, hogy hova kerül a szöveg.

    Írj, légyszi, konkrét példát (csak az egyértelműség miatt) arra, hogy 0-s oldalszám esetén (amikor az évszám/újságszám mappába közvetlenül, nem egy további számozott almappába kerül a feltöltött fájl) pontosan hogyan néz ki a fájl neve/útvonala. Illetőleg, ha tömegesen dolgozod fel (nevezed/mozgatod át) a képeket, az milyen szabály alapján fog történni? Honnan tudod, hogy melyik kép melyik oldalra fog kerülni?

    Mutasd a teljes hozzászólást!
  • Tehát, amikor az újságró berja a szöveget, még nem (biztos), hogy tudja, hogy melyik oldara kerül.

    Megírja a szöveget, az oldalszámot meghatározó "ablakba" nem ír be számot, így az adatbázisban lévő "default" szám kerül, azaz a "0". Ebben az esetben konkrétan a szöveg a 2020-as év, 1003-as lapszámába kerül és az automatizmus alapján mondjuk a 10-es számot kapja a szöveg.
    ehhez a szöveghez kiválaszt pl. 2 db képet is, amit feltölt.

    Mivel nem választott ki oldalszámot, így ez fog következni ezek a fileok jönnek létre:
    kepek/2020/1003/2020_1003_10.docx
    kepek/2020/1003/2020_1003_10_0_img_azeredetifileneve.jpg
    kepek/2020/1003/2020_1003_10_0_img_azeredetifilenevevalamimas.jpg

    Amennyiben a szerkesztő v az újságíró átírja az oldalszámot a feltöltésnél (vagy a módosításnál) 0-ról 1-re, akkor a kepek/2020/1003 könyvátban létrehoz (ha még nincs) egy alkönyvárat ami az oldalszámot határozza meg. Pl. beírja a 2-es számot, így létrejön a 2-es alkönyvtár és ekkor így néz ki a "kepek" könyvtár:

    kepek/2020/1003/2/

    Ekkor a kepek/2020/1003/2020_1003_10.docx dokumentum törlődik és átkerül a
    kepek/2020/1003/2/2020_1003_10.docx (a szövegekhez is beillesztem majd az oldalszámot, de azzal nem lesz gondom, a szöveggel nem kell foglalkozni)

    ekkor kellene a képeknek is törlődniük onnan, ahol eddig voltak és átkerülniük a /2/-es könyvtárba és akkor így néznének ki:

    kepek/2020/1003/2020_1003_10_2_img_azeredetifileneve.jpg
    kepek/2020/1003/2020_1003_10_2_img_azeredetifilenevevalamimas.jpg

    illetve, amikor esetleg még változna az oldalszám, akkor értelemszerűen törlődnének a /2/ könyvtárból és átkerülnének oda, ahova kiválasztják és a filenévben lévő "2"-es is átíródna arra a számra, amelyik oldalra kerülnek.

    Hát, remélem érthetőbb.
    Mutasd a teljes hozzászólást!
  • Hali!

    Azt gondolom, talán értem a problémát. Itt egy függvény, ami bármelyik oldalról bármelyik oldalra átnevezi/mozgatja a fájlokat (a dokumentumokat is, amennyiben az oldalszám is benne van a névben):
    function movePage(int $year, int $issueNr, int $textNr, int $toPage, int $fromPage = 0, string $base = './kepek') { $fromPath = "$base/$year/$issueNr/".($fromPage > 0 ? $fromPage."/" : ""); $toPath = "$base/$year/$issueNr/$toPage/"; // Mappa létrehozása @mkdir($toPath, 0644); // Fájlok mozgatása $movedFiles = 0; $filenameTemplate = "{$year}_{$issueNr}_{$textNr}_{$fromPage}*.{doc,docx,pdf,jpg,jpeg,png,gif}"; if (($files = glob($fromPath.$filenameTemplate, GLOB_BRACE)) !== false) { $pattern = '/^\d+_\d+_\d+_\d+_(.+)$/'; $replace = "{$year}_{$issueNr}_{$textNr}_{$toPage}_$1"; foreach ($files as $filename) { if (@rename($fromPath.$filename, $toPath.preg_replace($pattern, $replace, $filename))) { $movedFiles++; } } } return $movedFiles; }
    A hívása, remélem, egyértelmű. Elvileg nincs benne hiba, de értelemszerűen nem tudtam tesztelni.

    Mutasd a teljes hozzászólást!
  • Köszönöm szépen!!!!!!!
    Mutasd a teljes hozzászólást!
  • A működő:

    $year = $user_txt_year; $issueNr = $user_txt_nr; $textNr = $text_nr; $toPage = $text_page; $fromPage = $old_page; $basedir = './kepek'; function moveTextToPage(int $year, int $issueNr, int $textNr, int $toPage, int $fromPage = 0, string $base = './kepek') { $fromPath = "$base/$year/$issueNr/" . ($fromPage > 0 ? $fromPage . "/" : ""); $toPath = "$base/$year/$issueNr/$toPage/"; // Mappa létrehozása @mkdir($toPath, 0644); // Fájlok mozgatása $movedFiles = 0; $filenameTemplate = "{$year}_{$issueNr}_{$textNr}_{$fromPage}*.{doc,docx,pdf,jpg,jpeg,png,gif}"; if (($files = glob($fromPath . $filenameTemplate, GLOB_BRACE)) !== false) { $pattern = '/^(.+\/)\d+_\d+_\d+_\d+(_?.+)$/is'; $replace = "{$year}_{$issueNr}_{$textNr}_{$toPage}$2"; foreach ($files as $filename) { if (@rename($filename, $toPath . preg_replace($pattern, $replace, $filename))) { $movedFiles++; } } } return $movedFiles; } moveTextToPage($user_txt_year, $user_txt_nr, $text_nr, $text_page, $old_page, $basedir);
    Köszönöm, még egyszer!
    Mutasd a teljes hozzászólást!
  • Találtam egy hibát a filok átmásolásában. Amikor "0"-val (oldalszám) kezdem a feltöltést, akkor ha átírom "1"-es vagy másik oldalra a fájlok másolását, akkor nem másolódnak át. Ha "1"-essel vagy nagyobb oldalértéket adok meg, akkor másr működik a másolás bármelyik oldalra, még a "0"-ra is, és onnan tovább is.
    Előre is köszönöm.
    T
    Mutasd a teljes hozzászólást!
  • Én ezt az egészet úgy csinálnám, hogy a képeket feltölteném egy upload könyvtárba, egy rövid unique néven, amit generálok, és az adminisztrációt pedig adatbázisba tenném, tehát hogy melyik oldal, melyik lapszám, stb, nem a file nevébe.
    Mutasd a teljes hozzászólást!
  • Hali,
    ez a programocska nem az internetre készül, hanem újságkészítéshez. A szövegbevitel azért lett így megoldva, mert ugye mindenkinek különböző Wordje van és mindenki máshogy írja meg a szövegét, így itt egyszerűen egyesíteni lehet azokat. Ezen felül azonnal csatolni lehet a képeket a szövegekhez így a tördelőnek könnyíti meg a munkáját. A program generál egy Word filet, ami "tiszta" a tördelő számára és egyszerüen csak beilleszti a tördelőprogramba, nincs gondja az utólagos formázással. A tördelő a könyvtárakat használja, onnan tölti be a dokumentumot és a képeket, az újságírók a szövegrészt használják, ami gyakorlatilag egy (könnyen visszaolvasható) statisztika is arról, hogy ki mennyit írt melyik számba stb. Kb 20 éve készítettem már egy ilyen programocskát, ez most annak a továbbgondolása lenne. És persze a modernabb változata.
    Üdv,
    T
    Mutasd a teljes hozzászólást!
  • áh értem
    Mutasd a teljes hozzászólást!
  • Megpróbálok saját magamnak válaszolni, merthogy úgy néz ki, hogy rájöttem, mi a gond. Azért teszem ki a helyes megoldást, ha valaki használná a scriptet, akkor EZ a jó:

    $year = $user_txt_year; $issueNr = $user_txt_nr; $textNr = $text_nr; $toPage = $text_page; $fromPage = $old_page; $basedir = './tekstovi'; function moveTextToPage(int $year, int $issueNr, int $textNr, int $toPage, int $fromPage, string $base = './tekstovi') { $fromPath = "$base/$year/$issueNr/" . ($fromPage > '-1' ? $fromPage . "/" : ""); $toPath = "$base/$year/$issueNr/$toPage/"; // Mappa létrehozása @mkdir($toPath, 0777, true); // Fájlok mozgatása $movedFiles = 0; $filenameTemplate = "{$year}_{$issueNr}_{$textNr}_{$fromPage}*.{doc,docx,odt,pdf,jpg,jpeg,png,gif,psd,eps,ai,tiff,tif}"; if (($files = glob($fromPath . $filenameTemplate, GLOB_BRACE)) !== false) { $pattern = '/^(.+\/)\d+_\d+_\d+_\d+(_?.+)$/is'; $replace = "{$year}_{$issueNr}_{$textNr}_{$toPage}$2"; foreach ($files as $filename) { if (@rename($filename, $toPath . preg_replace($pattern, $replace, $filename))) { $movedFiles++; } } } return $movedFiles; } moveTextToPage($user_txt_year, $user_txt_nr, $text_nr, $text_page, $old_page, $basedir);
    A problémát itt találtam meg:
    ($fromPage > '-1' ? $fromPage . "/" : "");
    a "-1" helyett "0" volt.

    T
    Mutasd a teljes hozzászólást!
  • Hali!

    … a "-1" helyett "0" volt.

    Az eredeti kódomban az is van, sőt, az általad beillesztett első működő kódban is.

    Mutasd a teljes hozzászólást!
  • A működőben is, amit beillesztettem, "0" van, de nem az a lényeg, hanem az, hogy most jó.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd