Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przekazanie do bazy informacji o plikach img
mkoszar
post 13.01.2021, 12:22:44
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 10.09.2020

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
LowiczakPL
post 13.01.2021, 12:41:49
Post #2





Grupa: Zarejestrowani
Postów: 531
Pomógł: 55
Dołączył: 3.01.2016
Skąd: Łowicz

Ostrzeżenie: (0%)
-----


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


Ten post edytował LowiczakPL 13.01.2021, 12:46:47


--------------------
Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
Go to the top of the page
+Quote Post
mkoszar
post 13.01.2021, 18:11:43
Post #3





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 10.09.2020

Ostrzeżenie: (0%)
-----


Dziękuję za podpowiedź. Raczej wszystko działa zgodnie z oczekiwaniem.

Tylko teraz jak by tu zapisać informację o przesłanych plikach ?
Go to the top of the page
+Quote Post
shpaque
post 14.01.2021, 09:15:04
Post #4





Grupa: Zarejestrowani
Postów: 651
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


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)
Go to the top of the page
+Quote Post
mkoszar
post 14.01.2021, 10:53:00
Post #5





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 10.09.2020

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
dublinka
post 14.01.2021, 11:08:36
Post #6





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
shpaque
post 14.01.2021, 11:34:25
Post #7





Grupa: Zarejestrowani
Postów: 651
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


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. }


Ten post edytował shpaque 14.01.2021, 11:35:43
Go to the top of the page
+Quote Post
mkoszar
post 14.01.2021, 11:42:33
Post #8





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 10.09.2020

Ostrzeżenie: (0%)
-----


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?

Ten post edytował mkoszar 14.01.2021, 11:43:05
Go to the top of the page
+Quote Post
shpaque
post 14.01.2021, 12:59:31
Post #9





Grupa: Zarejestrowani
Postów: 651
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


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. }
Go to the top of the page
+Quote Post
mkoszar
post 15.01.2021, 07:42:21
Post #10





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 10.09.2020

Ostrzeżenie: (0%)
-----


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;




Go to the top of the page
+Quote Post
dublinka
post 15.01.2021, 10:18:01
Post #11





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
mkoszar
post 15.01.2021, 10:32:31
Post #12





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 10.09.2020

Ostrzeżenie: (0%)
-----


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.



Go to the top of the page
+Quote Post
gino
post 15.01.2021, 13:13:36
Post #13





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mkoszar
post 15.01.2021, 13:14:08
Post #14





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 10.09.2020

Ostrzeżenie: (0%)
-----


OK, temat ogarnięty i zrozumiany ! dzięki !

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

pomógł artykuł
Go to the top of the page
+Quote Post
miccom
post 19.04.2021, 21:01:45
Post #15





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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ę.


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 11:11