PHP i rekursywne wrzucanie plikow

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Beyo
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 25 maja 2005, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: GNOME

[Zarzucone] PHP i rekursywne wrzucanie plikow

Post autor: Beyo »

Witam.
pisze skrypcik do wrzucania zdjęc do galerii spod [url]http://WWW...tyle[/url] że na razie niestety trzeba dodawać każde zdjęcie osobno.
Nie moge sie nigdzie doszukac jak zrealizowac rekursywne wrzucanie calego katalogu, z tego co zauwazylem php nie wspiera takiej funkcji :(
Jakies sugestie?
Awatar użytkownika
Robert Seth Draco
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 02 lip 2008, 17:47
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: Robert Seth Draco »

NIE?

Możesz wrzucić za pomocą skryptu ZZipowany lub ztarowany katalog na serwer i o ile ten serwer na to pozwoli za pomocą skryptu go rozpakować we wskazane miejsce :D
Rozpakowywanie plików:
Jeśli plik ma rozszerzenie .tar.gz:

Kod: Zaznacz cały

<?php
system ("/bin/tar zxvfp nazwa_pliku.tar.gz");
?>
lub jeśli plik ma rozszerzenie .zip:

Kod: Zaznacz cały

<?php
system ("/bin/unzip -o test.zip");
?>
Co do wrzucania to przerób dowolny skrypt do wrzucania plików na serwer :D np taki :

Na początek plik Formularz.html
<form method="post" action="wyslij.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1024">
Wybierz plik do wysłania:
<input type="file" name="plik" size="30">

<input type="submit" value="Wyślij">
A teraz stronka do Upoadu w PHP wyslij.php:

Kod: Zaznacz cały

  <?php
 $rot = $_SERVER['DOCUMENT_ROOT'];
  
 move_uploaded_file($_FILES['plik']['tmp_name'], "$rot/../wyslane/".$_FILES['plik']['name']);
 ?>
<?php
 if (!is_uploaded_file($_FILES['plik']['tmp_name'])) {
  
    die ('Nie wysłano pliku, spróbuj później.');
    
 }
 ?>
Mniej więcej :D Pozdrawiam!
Beyo
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 25 maja 2005, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: GNOME

Odp: PHP i rekursywne wrzucanie plikow

Post autor: Beyo »

Hmm też jest to jakieś wyjście, ale ponieważ niektorzy uzytkownicy nie wiedza co to TAR ZIP i RAR (niestety tez sie tak zdarza) to sie zastanawiam czy nie da sie poprzez przegladarke odpalac zipa na lokalnym systemie?

No i problem polega na tym ze admin tego serwera nalozyl ograniczenie 3MB wielkosci na przesylany plik :/ :/ :/ dlatego chcialem pojedyczne fotki hurtowo przesylac na serwer...w sumie troche to dziwne..
w aplikacjach ftpowych mozesz dodac spokojnie caly katalog i program wie ze ma dodac do listy przesylu jego zawartosc...a tutaj takie niedociagniecie :)
dam
Sędziwy Jeż
Sędziwy Jeż
Posty: 40
Rejestracja: 21 maja 2008, 20:43
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: PHP i rekursywne wrzucanie plikow

Post autor: dam »

To lepiej zrobić tak, że wybierasz jedno zdjęcie z katalogu, którego cała zawartość ma się znaleźć na serwerze i z tej jednej fotki wyciągasz ścieżkę do tego katalogu i przelatujesz ten katalog w pętli wysyłając po kolej każdy plik z niego, dodatkowo rozpoznając rozszerzenie, tak żeby przepuszczał tylko pliki graficzne, albo zrobić dynamiczne dodawanie pól typu "file" i wysyłanie ich wszystkich za jednym razem, ale to tez dużo roboty przy większej ilości plików.
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: el.pescado »

w aplikacjach ftpowych mozesz dodac spokojnie caly katalog
FTP to FTP a HTTP to HTTP... Cóż, takie są założenia protokołu HTTP. Skryptem tu nic nie poradzisz - protokół zakłada, że można wysłać pojedynczy plik, przez co przeglądarki internetowe nie pozwalają na nic więcej. HTTP został zaprojektowany do przesyłania hipertekstu, natomiast FTP do przesyłania plików, dlatego pewne rzeczy można zrobbić w klientach FTP a w klientach HTTP już nie.
To lepiej zrobić tak, że wybierasz jedno zdjęcie z katalogu, którego cała zawartość ma się znaleźć na serwerze i z tej jednej fotki wyciągasz ścieżkę do tego katalogu i przelatujesz ten katalog w pętli wysyłając po kolej każdy plik z niego, dodatkowo rozpoznając rozszerzenie, tak żeby przepuszczał tylko pliki graficzne
Pamiętaj że skrypt działa na serwerze, a pliki są na komputerze użytkownika - to po prostu nie ma prawa działać, nawet kiedy serwer i klient znajdują się na jednej maszynie - z tego prostego powodu, że przesyłana nie jest ścieżka do pliku, tylko jego zawartość. Ponadto, skrypt na serwerze nia ma dostępu do plików na komputerze klienta.
albo zrobić dynamiczne dodawanie pól typu "file" i wysyłanie ich wszystkich za jednym razem, ale to tez dużo roboty przy większej ilości plików.
ZTCW. O ile można dynamicznie dodać pole typu "file", to już ze względu na bezpieczeństwo nie można go automatycznie wypełnić. Nie mówiąc już o tym, że nie ma skąd wziąć nazwy pliku, którą chciałoby się wpisać do tego pola.

Ogólnie, są trzy rozwiązania takiej sytuacji:
1. Wysyłanie plików w archiwach zip, tar etc. Jak ktoś nie potrafi obsługiwać archiwów to albo się nauczy - wyjdzie mu to na dobre;) albo się będzie męczył - ma wybór;P W każdym razie, imageshack.us chyba tak robi.
2. Wysyłanie plików przez FTP do specjalnego katalogu na serwerze, a potem importowanie ich za pomocą skryptu.
3. Napisanie specjalnej aplikacji klienckiej (czy skryptu odpalanego przez użytkownika), który by się np. integrował z menedżerem plików i umożliwiał wysyłanie plików na serwer.
dam
Sędziwy Jeż
Sędziwy Jeż
Posty: 40
Rejestracja: 21 maja 2008, 20:43
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: PHP i rekursywne wrzucanie plikow

Post autor: dam »

Pamiętaj że skrypt działa na serwerze, a pliki są na komputerze użytkownika - to po prostu nie ma prawa działać, nawet kiedy serwer i klient znajdują się na jednej maszynie - z tego prostego powodu, że przesyłana nie jest ścieżka do pliku, tylko jego zawartość. Ponadto, skrypt na serwerze nia ma dostępu do plików na komputerze klienta.
Kurcze jak mogłem o tym nie pomyśleć, chyba za duże przyzwyczajenie do pisania w PHP-GTK, gdzie pracuje się na lokalnych plikach. :D tak czy inaczej sorrki za wprowadzenie w błąd.
ZTCW. O ile można dynamicznie dodać pole typu "file", to już ze względu na bezpieczeństwo nie można go automatycznie wypełnić. Nie mówiąc już o tym, że nie ma skąd wziąć nazwy pliku, którą chciałoby się wpisać do tego pola.
dla tego napisałem, że przy większej ilości plików to dużo roboty, bo każdy plik i tak trzeba samemu, wybrać.
Beyo
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 25 maja 2005, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: GNOME

Odp: PHP i rekursywne wrzucanie plikow

Post autor: Beyo »

A czy spod przegladarki mozna odpalic z lokalnego kompa sesje ftp?
w zasadzie każda winda od 2000 w gore ma to wbudowane systemowo.

A jak mowisz o specjalnej aplikacji klienckiej to hm...aż by się prosiło o wtyczke do Firefoxa...:)

a co do formularza na wrzucanie na razie mam cos takiego (nie do konca mojego autorstwa lekko przerobione z wersji znalezionej gdzieś w necie)

Kod: Zaznacz cały

<form action="" method="post" enctype="multipart/form-data">
<p>!!! Uwaga maksymalny rozmiar obrazka 2MB !!!

<p>obnrazki:

<input type="file" name="pictures[]" />

<input type="file" name="pictures[]" />

<input type="file" name="pictures[]" />

<input type="file" name="pictures[]" />

<input type="submit" value="Send" />
</p>
</form>

<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
    $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
    $name = $_FILES["pictures"]["name"][$key];
    move_uploaded_file($tmp_name, "upload/$name");
    }
}
?> 
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: el.pescado »

A czy spod przegladarki mozna odpalic z lokalnego kompa sesje ftp?
w zasadzie każda winda od 2000 w gore ma to wbudowane systemowo.
Jedyne co można zrobić, to chyba podać linka ftp://example.com/katalog/ i liczyć że użytkownik ma zainstalowany i ustawiony sensowny klient FTP. Explorer ma jakiegoś klienta ftp, ale nie wiem czy jest on jakiś sensowny - nigdy nie używałem.
A jak mowisz o specjalnej aplikacji klienckiej to hm...aż by się prosiło o wtyczke do Firefoxa...
Wystarczy prosty skrypt do nautilusa, coś w stylu:

Kod: Zaznacz cały

#!/bin/bash

ALBUM=`zenity --entry --text="Nazwa albumu"`
zip -r $* /tmp/pliki.zip
# Wysłanie pliku przez HTTP
curl --form album="$ALBUM" --form file=@/tmp/pliki.zip http://example.com/upload.php
zenity --info --text="Pliki zostały wysłane"
Nie sprawdzałem, czy powyższe działa, ale powinny wystarczyć drobne zmiany, dobrze byłoby też dodać jakieś powiadomienia o postępach. W każdym razie, taki skrypt trzeba umieścić w pliku ~.gnome/nautilus-scripts/Wyślij i nadać mu prawa wykonywalności i odtąd będzie można go wywoływać z menu.
Awatar użytkownika
Robert Seth Draco
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 02 lip 2008, 17:47
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: Robert Seth Draco »

Beyo pisze:A czy spod przegladarki mozna odpalic z lokalnego kompa sesje ftp?
w zasadzie każda winda od 2000 w gore ma to wbudowane systemowo.

A jak mowisz o specjalnej aplikacji klienckiej to hm...aż by się prosiło o wtyczke do Firefoxa...:)

a co do formularza na wrzucanie na razie mam cos takiego (nie do konca mojego autorstwa lekko przerobione z wersji znalezionej gdzieś w necie)

Kod: Zaznacz cały

<form action="" method="post" enctype="multipart/form-data">
<p>!!! Uwaga maksymalny rozmiar obrazka 2MB !!!

<p>obnrazki:

<input type="file" name="pictures[]" />

<input type="file" name="pictures[]" />

<input type="file" name="pictures[]" />

<input type="file" name="pictures[]" />

<input type="submit" value="Send" />
</p>
</form>

<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
    $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
    $name = $_FILES["pictures"]["name"][$key];
    move_uploaded_file($tmp_name, "upload/$name");
    }
}
?> 
Powyższy kod może nie zadziałać. Pierwsze to nie ma w formularzu akcji do skryptu a sam skrypt jest łatwy dla hackerów. Ale jest ok... Jak na początek.

z aplikacji klienckich to też polecam wtyczkę lub: Filezilla :D
sebcioz
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 02 lis 2006, 10:45
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: sebcioz »

Swego czasu napisałem mały skrypcik - teraz po zmianie pola file, automatycznie dodawanie jest inne:
>Przykład<

Kod: Zaznacz cały

<script>
function add_form(nam, i) {

	if (document.getElementById(nam + '_' + i).innerHTML.search('uploadfile') == -1) {
	document.getElementById(nam + '_' + i).innerHTML = '<input type="file" class="uploadfile" name="' + nam +'[]" onChange="return add_form(\'' + nam + '\', ' + (i+1) + ');" />
<span id="' + nam + '_' + (i+1) + '"><input type="button" onClick="add_form(\'' + nam + '\',' + (i+1) + ');" value="Dodaj" /><\/span>';
	}
}
</script>

<form enctype="multipart/form-data" action="#" method="post">				
	<input type="file" class="uploadfile" maxsize="2097152" name="upload[]" onChange="add_form('upload', 1);" />

	<span id="upload_1"><input type="button" value="Dodaj następne" onClick="add_form('upload', 1);" /></span>


	<input type="submit" value="Wyślij" name="images_add_submit" />
</form>
Inny OS = Arch Linux

Blog: http://sebcioz.co.cc/blog/
Awatar użytkownika
Robert Seth Draco
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 02 lip 2008, 17:47
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: Robert Seth Draco »

O bardzo ciekawy! :D
sebcioz
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 02 lis 2006, 10:45
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: sebcioz »

Robert Seth Draco pisze:

Kod: Zaznacz cały

<?php
system ("/bin/tar zxvfp nazwa_pliku.tar.gz");
?>

Kod: Zaznacz cały

<?php
system ("/bin/unzip -o test.zip");
?>
Nie ma szans, żeby to działało - wszystkie szanujące się serwery mają wyłączone w apache'u funkcje exec(), system() itd. - ze względu bezpieczeństwa.

Do rozpakowywania plików *.zip służa funkcje tj: zip_open(), zip_read(), zip_entry_open() itp (więcej na http://pl2.php.net/zip

Natomiast do rozpakowywania archiwów *.tar - http://pl.php.net/zlib
Inny OS = Arch Linux

Blog: http://sebcioz.co.cc/blog/
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: el.pescado »

Nie ma szans, żeby to działało - wszystkie szanujące się serwery mają wyłączone w apache'u funkcje exec(), system() itd. - ze względu bezpieczeństwa.
No nie wiem, ja nieraz na hostowanym serwerze korzystałem z zewnętrznych programów z poziomu PHP - głównie z ImageMagick i nie było z tym problemów (i były to raczej "szanujące się" serwery). I bynajmniej nie jest to luka w bezpieczeństwie - oczywiście zakłądając, że serwer jest poprawnie skonfigurowany.
Beyo
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 25 maja 2005, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: GNOME

Odp: PHP i rekursywne wrzucanie plikow

Post autor: Beyo »

Robert Seth Draco pisze:O bardzo ciekawy! :D
Widze tylko maly error..po wybraniu pliku nie ma mozliwosci skasowania sciezki przez backspace albo del na wypadek jakbysmy sie pomylili.

A jakby to zrobic tak od 2 strony nieco lopatologicznie..chodzi o to by wyswietlic zawartosc lokalnego katalogu cos jak po nacisnieciu pola "browse" i aby byla mozliwosc zaznaczenia kilku plikow ctrl+myszka.
Klikamy następnie dodaj a skrypt sam umieszczalby sciezke do zaznaczonych plików w polach w Twoim skrypcie i wowczas tylko "wyslij" i juz.
Nieco naokolo ale mogloby sie udać, tylko jakas funkcja zczytujaca absolute path byla by potrzebna.

Metoda 2: skrypt listowalby nazwy wszystkich plikow w danym katalogu, umieszczalby je w pliku tekstowym, do kazdego dolaczal z przodu jego lokalny URL a następnie w pętli umieszczał sciezki w polach do wysłania.

Przy kilka zdjęciach można dodawać ręcznie kazda sciezke ale jakby sie chcialo wyslac ich np 100...to się robi problem.Dlatego też zalezy mi na tym by proces nieco zautomatyzować.

A ktoś wie w jaki sposób rozwiązuje to np. Picasa przy transferze do swoich web albums?
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: PHP i rekursywne wrzucanie plikow

Post autor: el.pescado »

A jakby to zrobic tak od 2 strony nieco lopatologicznie..chodzi o to by wyswietlic zawartosc lokalnego katalogu cos jak po nacisnieciu pola "browse" i aby byla mozliwosc zaznaczenia kilku plikow ctrl+myszka.
Klikamy następnie dodaj a skrypt sam umieszczalby sciezke do zaznaczonych plików w polach w Twoim skrypcie i wowczas tylko "wyslij" i juz.
Ale już pisałem, że skrypt PHP działa na serwerze i nie ma dostępu do dysku komputera, na którym działa przeglądarka. Teoretycznie możnaby użyć JavaScript, który jest uruchamiany w przeglądarce, ale ze względów bezpieczeństwa skrypty JavaScript też nie mają dostępu do systemu plików.

Ewentualnie jest jeszcze jeden sposób - który rzeczywiście może działać tak, jak chcesz. Możesz napisać obiekt ActiveX, który osadza się na stronie, i który się wykonuje na komputerze klienta. Taki obiekt, o ile dobrze pamiętam, nie ma żadnych ograniczeń w dostępie do komputera, na którym został uruchomiony (uroczo, nieprawdaż:D), może więc wyświetlić listę plików i wysłać je na serwer. Wadą jest to, że ActiveX działa tylko w przeglądarce IE pod Windows.
Możliwe, że podobną funkcjonalność można osiągnąć tworząc podpisany aplet Java (niepodpisane aplety mają szereg ograniczeń). Aplety Java działają na większości przeglądarek na większości systemów operacyjnych.

A ktoś wie w jaki sposób rozwiązuje to np. Picasa przy transferze do swoich web albums?
Picasa to aplikacja uruchamiana lokalnie na komputerze klienta, więc nie ma takich ograniczeń. W podobny sposób można napisać np. skrypt do Nautilusa, tak jak napisałem kilka postów wyżej.
Beyo
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 25 maja 2005, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: GNOME

Odp: PHP i rekursywne wrzucanie plikow

Post autor: Beyo »

Zastanawia mnie to co mowisz bo daje glowe ze widzialem gdzieś w necie skrypt phpowski ktory pozwalal wbudowac we wyswietlaną stronę zawartosc lokalnego katalogu uzytkownika..jak znajde to zapodam linka.
To w koncu musi miec jakies rozwiazanie.
dam
Sędziwy Jeż
Sędziwy Jeż
Posty: 40
Rejestracja: 21 maja 2008, 20:43
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: PHP i rekursywne wrzucanie plikow

Post autor: dam »

@Beyo, kolega @el.pescado ma racje, kod php wykonuje się po stronie serwera i nie ma dostępu do lokalnych zasobów komputera klienta, dlatego listowanie jego katalogów/plików nie jest możliwe, zresztą niezbyt bezpiecznie byłoby gdyby było to możliwe.
Beyo
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 25 maja 2005, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: GNOME

Odp: PHP i rekursywne wrzucanie plikow

Post autor: Beyo »

No dobra czyli dam sobie spokój, chyba ze wpadne na to przypadkiem.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości