Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazanie do bazy informacji o plikach img
Forum PHP.pl > Forum > PHP
mkoszar
Witam.
Mam prośbę o podpowiedź jak poradzić sobie z takim zagadnieniem, mianowicie:

Jest formularz, którym użytkownik przekazuje dane do bazy: Autor, Nazwa, Opis.
Ale jeszcze do katalogu uploaduje zdjęcia poprzez
<input name="upload[]" type="file" multiple>
W bazie danych mam oczywiście kolumny tak nazwane. Wpisuję/pobieram i jest OK.

I teraz pytanie/problem polega na tym, jak zapisać informację o obrazach w bazie ? Co prawda mam tablicę upload[] przesłaną z inputa... ale informacji ile ktoś prześle obrazków nigdy nie będę miał...

Pomyślałem, żeby zrobić kolumnę img i tam wpisać nazwy plików przesłanych przez użytkownika? Ale co? dodawać np średniki po nazwach w później jakimś wyrażeniem regularnym pobierać po średnikach.. bo docelowo chciałbym, żeby to były osobne <img src="/katalog/$zmienna"> questionmark.gif

nie wiem czy dobrze kombinuje
LowiczakPL
jeśli masz pole

  1. <input name="images[]" type="file" multiple>


to robisz foreach po $images i pobierasz sobie nazwy plików, zapisujesz każdy plik, modyfikujesz czy co tam chcesz

w bazie danych możesz to przechowywać jako zserializowna tablicę

wiec zawsze będziesz wiedział ile i jakie sa pliki

Tylko nie zapisuje się na serwerze plików w oryginalnej nazwie usera, tylko musisz nadać im swoje unikalne nazwy i te nazwy też zapisać w tej swojej tablicy

Do unikalnej nazwy pliku możesz zastosować sobie np:

  1. $info = new SplFileInfo('foo.txt');
  2. $ext = '.' . $info->getExtension();
  3.  
  4. $prefix = bin2hex(random_bytes(4));
  5. $name = $prefix . time() . $ext
mkoszar
Dziękuję za podpowiedź. Raczej wszystko działa zgodnie z oczekiwaniem.

Tylko teraz jak by tu zapisać informację o przesłanych plikach ?
shpaque
nie wiem czy chodzi ci o exif? jesli chodzi o dane plikow?

https://www.php.net/manual/en/book.exif.php

czy o dane uploadu
  1. print_r($_FILES)
mkoszar
hmm.. zobacz:
przesyłam inputem np. 3 pliki. i nadaję im nowe nazwy
$newname = $prefix . time() . $ext;

otrzymuję tym samym zmienną echo $newname;, która wygląda tak:

ae9840681610617145.png828f5f2f1610617145.png1e4c70e31610617145.png

no i mam nazwy tych plików.

Kombinuję teraz tak: zapisuję tą zmienną do bazy

CODE
$save = "UPDATE `partner` SET `img` = '$newname' WHERE `partner`.`nk` = '$nk'";
mysqli_query($db, $save);


hmmm i co dalej ? Dalej trzeba by zrobić pętlę, która "rozbierze" to coś ae9840681610617145.png828f5f2f1610617145.png1e4c70e31610617145.png na takie coś
<img src="www.costam.pl/ae9840681610617145.png"/>
<img src="www.costam.pl/828f5f2f1610617145.png"/>
<img src="www.costam.pl/1e4c70e31610617145.png"/>

No i tutaj się zatrzymałem z tokiem myślenia arrowheadsmiley.png
dublinka
To tablica wiec

  1. count($_FILES['file']['name']);


Reszty niebardzo rozumiem o co ci chodzi.
Jesli masz problem z dobraniem sie do nazw plikow to przed zaposem dodaj jakis separator chocby przecinek a podczas odczytu daj explode
shpaque
Cytat(mkoszar @ 14.01.2021, 10:53:00 ) *
hmmm i co dalej ? Dalej trzeba by zrobić pętlę, która "rozbierze" to coś ae9840681610617145.png828f5f2f1610617145.png1e4c70e31610617145.png na takie coś
<img src="www.costam.pl/ae9840681610617145.png"/>
<img src="www.costam.pl/828f5f2f1610617145.png"/>
<img src="www.costam.pl/1e4c70e31610617145.png"/>

No i tutaj się zatrzymałem z tokiem myślenia arrowheadsmiley.png


  1. foreach ($_FILES['upload]['tmp_name'] as $f) {
  2. //tu smieniasz sobie abys mial z kazedgo liku swój name
  3. $name = $prefix.time().$ext
  4. echo '<img src="www.costam.pl/'.$name.'"/>';
  5. }
mkoszar
Cytat(dublinka @ 14.01.2021, 11:08:36 ) *
To tablica wiec

  1. count($_FILES['file']['name']);


Reszty niebardzo rozumiem o co ci chodzi.
Jesli masz problem z dobraniem sie do nazw plikow to przed zaposem dodaj jakis separator chocby przecinek a podczas odczytu daj explode


A właśnie nic nie działa.. A jak zapisać do bazy dane o tych 3 plikach ? o samych nazwach
jeśli jest to tablica?
shpaque
tez mozesz zapisac petla foreach jak dalem ci ogolnik powyzej

... albo rozbij sobie jesli to string z tymi nazwami plikow powinienes go skonstruowac tak, zeby byla w nim jednakowa wartosc rodzielajaca te pliki, np resdnik (wink.gif wtedy mialbys

robisz

  1. $stringZplikami = 'plik1.png;plik2.png;plik3.png';
  2. $tablicaPlikow = explode(';', $stringZplikami);


i wtedy masz już tablicę:

  1. echo $tablicaPlikow[0]; // plik1.png
  2. echo $tablicaPlikow[1]; // plik2.png
  3. ...


lub z petli np foreach lub for

  1. foreach ($tablicaPlikow as $p) {
  2. [komenda wpisania do bazy] = $p;
  3.  
  4. lub
  5.  
  6. echo $p; // zobaczysz co sie dzieje
  7. }
mkoszar
Witajcie. Przespałem się z tematem i dzisiaj na świeżo już coś z tego rozumiem.

CODE
if(count($_FILES['upload']['name']) > 0){
for($i=0; $i<count($_FILES['upload']['name']); $i++) {
$tmpFilePath = $_FILES['upload']['tmp_name'][$i];

if($tmpFilePath != ""){
$shortname = $_FILES['upload']['name'][$i];
$info = new SplFileInfo($_FILES['upload']['name'][$i]);
$ext = '.' . $info->getExtension();

$check_ext = $info->getExtension();
$ext_allow= array("gif","tif","tiff","jpeg","jpg","png","pdf","exe","zip","rar","txt");

if (in_array($check_ext,$ext_allow, TRUE)){
$prefix = bin2hex(random_bytes(4));
$newname = $prefix . time() . $ext;
$filePath = "$autor/".$newname;

if(move_uploaded_file($tmpFilePath, $filePath)) {

$files[] = $shortname;
$serialized_files = serialize($files);
$save = "UPDATE `diypartner` SET `img` = '$serialized_files' WHERE `diypartner`.`nk` = '$nk'";
mysqli_query($db, $save);


}
} else {
echo $check_ext."<br>";
echo "ERROR - nie można wysyłaś plików typu.";}
}
}
}




ALE przesyła mi do bazy oryginalne nazwy plików.. a pasowałoby mi przesłać te nazwy na które faktycznie zmienił akcją $newname = $prefix . time() . $ext;




mkoszar
Może jeszcze raz , żeby zrozumieć motyw działania:

1. Pobieram z inputa nazwy plików:

<input class="input-file" id="my-file" name="upload[]" type="file" multiple>

2. Pętlą FOR liczę i tworzę tablicę z nazwami tychże plików

for($i=0; $i<count($_FILES['upload']['name']); $i++) {
$tmpFilePath = $_FILES['upload']['tmp_name'][$i];
}


3. zapisuje te nazwy w zmiennej

$shortname = $_FILES['upload']['name'][$i];

4. Uzyskuję rozszerzenia i sprawdzam czy pasują do rozszerzeń, na które możemy pozwolić do przesłania

$info = new SplFileInfo($_FILES['upload']['name'][$i]);
$ext = '.' . $info->getExtension();
$check_ext = $info->getExtension();
$ext_allow= array("gif","tif","tiff","jpeg","jpg","png","pdf","exe","zip","rar","txt");


5. Jeśli pasują - to nadajemy im nowe nazwy i przesyłamy do katalogu "$autor/".$newname;

if (in_array($check_ext,$ext_allow, TRUE)){
$prefix = bin2hex(random_bytes(4));
$newname = $prefix . time() . $ext;
$filePath = "$autor/".$newname;
}


6. Później tą tablicę files[] serializujemy i wpisujemy do kolumny img tam gdzie wiersz odpowiada nazwie autora.

$files[] = $shortname;
$serialized_files = serialize($files);
$save = "UPDATE `diypartner` SET `img` = '$serialized_files' WHERE `diypartner`.`nki` = '$nk'";
mysqli_query($db, $save);

7. Efekt jest taki, że później na innej stronie chcąc wyciągnąć wpisy tego autora wyświetli nam się to co wpisał w formularzu i dodatkowo jakie pliki przesłał. A informacja i plikach znajduje się tylko w jednym zapisie smile.gif

[.... tutaj oczywiście łączymy z bazą danych... ]

$unserialized_array = unserialize($row[6]);

foreach ($unserialized_array as $value) {
echo '<img src="'.$row[2]."/".$value.'"/>';
}


8. Koniec.

Problem:
Z formularza pochodzą oryginalne nazwy plików punkt 3.
Później je zmieniam na losowe + data + rozszerzenie punkt 5.
a do bazy przesyłam sobie array $files[] = $shortname; i wpis w bazie wygląda tak :
a:5:{i:0;s:9:"1star.png";i:1;s:9:"2star.png";i:2;s:9:"3star.png";i:3;s:9:"4star.png";i:4;s:9:"5star.png";}

I zgubiłem się, dlaczego przesyła oryginalne nazwy plików.



gino
Cytat
I zgubiłem się, dlaczego przesyła oryginalne nazwy plików.

nie przesyła tylko Ty je zapisujesz, zmienioną nazwę pliku masz w zmiennej $newname, którą przesyłasz do katalogu, ale nie do bazy (przynajmniej tak wynika z Twojego opisu problemu). W $shortname masz oryginalne nazwy plików i te zapisujesz do bazy.
mkoszar
OK, temat ogarnięty i zrozumiany ! dzięki !

https://stackoverflow.com/questions/1870563...nto-a-directory

pomógł artykuł
miccom
Nie wiem czy nie lepiej zrobić w bazie danych tabelę np. userImages i zamiast trzymać to w jednym rekordzie dodałbym poszczególne wiersze jako pojedyncze adresy zdjęcia użytkownika X.

Planujesz edycję / usuwanie zdjęć z bazy danych / katalogu?

Jak będziesz miał wszystko w jednym rekordzie- będziesz miał bałagan o rozwoju aplikacji nie wspomnę.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.