Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Formularz typu file inny na mac'u w Safari niż na PC w explorerze
Forum PHP.pl > Forum > Przedszkole
Jero
Robię baze danych plikow audio zgromadzonych na dysku. Potrzebne mi są ścieżki do plików, które za pomocą formularza
  1. <FORM ACTION=dodaj.php><INPUT TYPE=file NAME=filename size=50><INPUT TYPE=submit value=Dodaj><br><input type=radio name=typ value=atmosfery checked><font face='arial narrow' size=3 color=#8F0000>ATMOSFERY&nbsp;&nbsp;&nbsp;&nbsp;<input type=radio name=typ value=efekty>EFEKTY&nbsp;&nbsp;&nbsp;&nbsp;<input type=radio name=typ value=muzyka>MUZYKA</font></form>

wgrywam do bazy danych MySQL.
Problem jest następujący:
W Explorerze i Operze na PC wszystko jest ok. Ścieżka do pliku wybierana z pola file przesyłana jest do bazy z lekką obróbką:
  1. <?php
  2. $filename = $_GET[filename];
  3. $filename = strtr($filename, '', '/);
  4. $filename = str_replace("//", "/", $filename);
  5. ?>

Natomiast w Safari na Mac pole file wygląda zupełnie inaczej. Nie ma tam pola tekstowego tylko sam przycisk Browse, a po wybraniu pliku ukazuje się obok jedynie nazwa pliku bez ścieżki. Skrypt przestaje funkcjonować - plik dodaj.php otwiera się bez żadnych zmiennych przesyłanych z formularza (nie ma w polu adresu dodaj.php?filename=costam.wav&typ=atmosfery..... itd). Dlaczego tak się dzieje? Czy można w jakiś sposób pozyskać z formularza w Safari na mac'u ściężkę do pliku i przesłać ją do bazy danych MySQL?

Proszę o pomoc
phpion
http://pl.php.net/features.file-upload
Nie musisz fizycznie uploadować pliku. Chodzi o to aby jego nazwę odczytać z tablicy $_FILES. Wydaje mi się, że powinno pomóc.
Jero
Ale to będzie sama nazwa pliku czy razem ze ścieżką? Ja potrzebuję scieżkę, bo do tych plików potem są tworzone linki. To ma być taka wyszukiwarka plików z możliwością otwierania, do których przypisane są dodatkowe informacje.

Sprawdziłem na szybko co zwraca zmienna $_FILES['filename']['name'] i jest to jedynie nazwa pliku bez ścieżki. To nie rozwiązuje mojego problemu...

Przeszukałem forum i kiedyś nijaki -miklosz- miał podobny problem:
Cytat
Witam!
Mam podobny problem - chodzi o to, że w bazie potrzebne mi info o tym, gdzie jest przechowywany plik na zamapowanym dysku. Przy wprowadzaniu formularza istotna jest tylko ścieżka do pliku, sam plik nie ma być w zasadzie uploadowany. Czy to w ogóle jest wykonalne??"

i sprawa została bez odpowiedzi.
Mi udało się zapisać ścieżkę do pliku, ale tylko na Windowsie, gdzie w formularzu ścieżka jest wpisana jako tekst w polu tekstowym. Potraktowałem ten tekst jak zmienną i wszystko gra. Natomiast, jak już wspominałem, na Macu nie ma wypisanej ścieżki i pojawia się problem. Wie ktoś jak to ominąć?
Riklaunim
Jeżeli chcesz robić lokalną wyszukiwarkę plików to napisz skrypt konsolowy, który wylistuje zawartość danego katalogu i zapisze oraz interfejs webowy do wyszukiwania i listowania. Jeżeli chcesz mieć taką funkcjonalność zdalnie - bez PHPa na danym komputerze to robienie tego przez formularz i pole wyboru pliku to masakra winksmiley.jpg Możesz coś poszukać z JavaScriptem - są skrypty nakładkowe na pole wyboru pliku.
Jero
Do każdego pliku ma być dodany opis z informacją co zawiera i słowa kluczowe. To musi być robione pojedyńczo poprzez formularz. Nie chodzi mi o wylistowanie zawartości danego katalogu. Po co miałbym to robić skoro są systemowe wyszukiwarki plików.
Koniecznie muszę mieć ścieżkę do pliku umiejscowioną w bazie mySQL. W Windowsie to działa, bo pole wyboru pliku składa się z przycisku Przeglądaj i pola tekstowego, z którego wyciągam zmienną zawierającą ścieżkę i wkładam do bazy. Ale w Safari na Macu pole wyboru pliku ma tylko przycisk i wyświetlaną poniżej nazwę wybranego pliku bez żadnej ścieżki. Skrypt przestaje działać, a ja nie wiem jak w takim razie to zrobić, bo docelowo wyszukiwarka ma być na Mac'a.
sowiq
Cytat(Jero @ 31.10.2008, 00:39:13 ) *
[...]W Windowsie to działa, bo pole wyboru pliku składa się z przycisku Przeglądaj i pola tekstowego, z którego wyciągam zmienną zawierającą ścieżkę i wkładam do bazy.[...]

Nie do końca. Firefox 3.x pozwoli Ci tylko na odczytanie nawy pliku, bez ścieżki. I z tego, co czytałem, da się to obejść tylko poprzez zmianę konfiguracji przeglądarki (about:config).
Jero
Wymyśliłem rzecz następującą:
Pliki umieszczane będą w folderach w document.root'cie. Zamiast korzystać z <input type=file> stworze type=text i button. A button będzie odnośnikiem do strony php, w której można przeglądać zawartość katalogów, wybrać żądany plik i następnie jego ścieżkę w postaci zmiennej przesłać do input type=text z głównej strony. Tyle z inwencji twórczej... Gorzej to wykonać, bo z php bawie się od tygodnia... Ma ktoś może jakieś gotowe rozwiązania na przeglądanie katalogów i wybór pliku?
sowiq
Ty na serio chcesz zrobić katalogowanie plików lokalnego kompa? I to przez wklejanie kolejnych ścieżek tych plików?

Dlaczego nie widzę sensu takiej zabawy?

1) na pewno jest wiele darmowych programów, które zrobią to o wiele szybciej (wiele z nich jest dedykowanych do katalogowania muzyki, potrafią np. czytać tagi ID3 itp)

2) są inne, o wiele lepsze języki programowania do takich rzeczy, chociażby JAVA (nie mylić broń Boże z JS!)
Riklaunim
Cytat(Jero @ 31.10.2008, 02:57:47 ) *
Wymyśliłem rzecz następującą:
Pliki umieszczane będą w folderach w document.root'cie. Zamiast korzystać z <input type=file> stworze type=text i button. A button będzie odnośnikiem do strony php, w której można przeglądać zawartość katalogów, wybrać żądany plik i następnie jego ścieżkę w postaci zmiennej przesłać do input type=text z głównej strony. Tyle z inwencji twórczej... Gorzej to wykonać, bo z php bawie się od tygodnia... Ma ktoś może jakieś gotowe rozwiązania na przeglądanie katalogów i wybór pliku?


Formularz nie nadaje się do "indeksowania" plików z lokalnego komputera. Od tego są aplikacje działające na danym komputerze.
Jero
Nie chcę katalogować mp3 tylko pliki wav, do których tagów nie ma. Robię tak zwaną fonotekę. To coś na kształt wpisów bibliotecznych... Tam również każda książka wpisywana jest osobno do bazy. Do plików dźwiękowych potrzebne są opisy - informacja kto nagrał, kto wykonuje itp. oraz słowa kluczowe, aby łatwo było wyszukać potrzebne zbiory np. śpiew ptaków, szum morza itp. Ta fonoteka dopiero rusza, więc nie ma jeszcze tego wiele... ale z czasem zacznie być tego dużo i właśnie po to to powstaje.
To ma być obsługiwane przez różnych ludzi... każdy może dodać dźwięk do fonoteki, wyszukać go, odsłuchać i użyć w swojej pracy. To musi być jasne, przejrzyste, bez zbędnych funkcji itd. Nie może to być gotowy program.
Za Javę podziękuję... chcę to zrobić na PHP/MySQL.
"Nie ma rzeczy niemożliwych, tylko czasami wymagają one trochę większego wkładu pracy. " smile.gif
sowiq
Ja nie mówię, że to niemożliwe. Wręcz przeciwnie - jest to całkiem łatwe do wykonania.

Za to dużo więcej pracy będą miały osoby katalogujące, bo taka aplikacja webowa będzie dużo mniej wygodna niż np. aplet Javy. A chyba o szybkość i łatwość obsługi ma tu chodzić.
Jero
Cytat
Formularz nie nadaje się do "indeksowania" plików z lokalnego komputera. Od tego są aplikacje działające na danym komputerze.


Gdy pliki znajdą się w document.root'cie to odnosniki do nich będą tak jak do plików na serwerze (bez liter dysku itp) i nie będzie miało znaczenia czy to lokalny komputer czy nie. Problemem zostaje tylko stworzenie strony php, na której przeglądane będą pliki z document.root'a. Kliknięcie na nazwę pliku będzie wysłaniem tej nazwy wraz ze ścieżką do pola tekstowego, którego zawartość trafiałaby do bazy. To jest wykonalne moim zdaniem.

Nie wiem czy dużo mniej wygodna... Na mac'u mam zainstalowany MAMP, który uruchamia serwer Apache i MySQL i od razu przeglądarkę z wybraną lokalizacją. Wystarczy kliknąć na ikonkę i fonoteka otwarta. O tworzeniu stron html wiem dużo i umiem zrobić stronę, która będzie wyglądała i będzie funcjonalna. A o apletach javie póki co nie wiem nic.
sowiq
readdir() to załatwi.

Co więcej - będziesz mógł wyświetlać np. pliki, które nie zostały jeszcze skatalogowane.

IMO pomysł z katalogiem root jest OK. Tylko ścieżki do plików umieszczałbym w polu typu hidden - jak ludzie będą mieli dostęp do edytowania tego, to mogą Ci tylko bałaganu narobić.
Riklaunim
Jak chcesz mieć możliwość słuchania - to musisz pliki ładować na serwer, więc ścieżki z komputera nie są potrzebne (do tego mogą się zmieniać). Po prostu nie rób dziwnych kombinacji. Chcesz katalogowania to wystarczy zwykły formularz z przesyłaniem pliku + opis + co tam jeszcze. Nie kombinuj z zapamiętywaniem jakiś tam lokalnych ścieżek - szczególnie jak to ma być obsługiwane przez wiele osób, z różnych komputerów itd.
Jero
Już doszedłem do wniosku, że pliki będą na serwerze, czyli na dysku przypisanym w Apache jako document.root, więc pliki będzie można bez problemu odtwarzać i otwierać. Póki co to będzie tylko na jednym komputerze bez dostępu do żadnej sieci, internetu itp. ze względów bezpieczeństwa danych, wirusów itp. Ścieżka do pliku jest konieczna, bo te pliki nie będą tylko do słuchania, ale też do pracy montażowej w aplikacjach audio. Najlepiej gdyby dało się po wyszukaniu pliku (oprócz posłuchania i zobaczenia ścieżki jak się do pliku dostać) otworzyć folder, w którym plik się znajduje i to jeszcze zaznaczony - już w środowisku systemowym. Wtedy już zostałoby tylko przeciągnąć plik do programu montażowego...
Chociaż właściwie, jeśli będzie wyświetlona ścieżka (poddana małej edycji - dodana litera dysku z przodu) to wystarczy ją zaznaczyć i skopiować do okienka importu pliku audio w programie do montazu. Na macu jest o tyle dobrze, że nie trzeba grzebać w folderach tylko ścieżkę można wpisać od razu.

Znalazłem fajny skrypt, który wypisuje listę plików wraz z linkami do nich i zwraca ścieżkę do pliku w postaci zmiennej $kat. Jedyny mankament jest taki, że jak się wejdzie do jakiegos folderu to link do pliku już sie nie zgadza, bo nie ma zmiennej opisującej scieżkę bezwzględną poprzedzającej nazwę pliku $plik.
Kod
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
        <title>Lista plikow</title>
</head>
<body>
<?php
$kat = $_GET['katalog'];
if (empty($kat))
   $kat = ".";
  else
   $kat = realpath($kat);
echo "Zawartosc katalogu : " . $kat . "<br>";
echo "<hr><br>";
$katalog = dir($kat);

while($plik = $katalog->read()){
  if (is_dir($kat . "/" . $plik)) {
  echo "<A HREF='kat.php?katalog=$kat/$plik'>[" . $plik . "]</A><BR>";
  }
  else
{
  echo "<A HREF='" . $plik . "'>" . $plik . "</A><BR>";
}
}

$katalog->close();
?>
</body>
</html>

Ale jak trochę pomyślę to wymyślę... Teraz ide w kime. Pozdrawiam

Rozwiązałem zagadkę: Między liniki
Kod
$kat = $_GET['katalog'];
if (empty($kat))
wstawiłem
Kod
$sciezka = $kat;
A linie
Kod
echo "<A HREF='" . $plik . "'>" . $plik . "</A><BR>";
zamieniłem na
Kod
echo "<A HREF='".$sciezka."/".$plik."'>" . $plik . "</A><BR>";

Może się komuś przyda. Dobranoc.

Sorry. Nie przetestowałem tego w pełni. Jednak to nie takie proste. $sciezka zwraca rozne dziwne historie... które raz są ok a raz nie... wiec będzie to trzeba zrobić inaczej.
Riklaunim
1. robisz skrypcik, np. w php, który będzie odpalany albo przez web, albo (to raczej lepsze) z terminala przez php-cli. Jego zadaniem będzie przeszukanie zawartości danego katalogu i jego podkatalogów - wyłapanie wszystkich wavów i zapisanie tego do bazy ze ścieżką systemową.
2. robisz drugi skrypt, który wyciąga dane z bazy i listuje na stronie www smile.gif

Jak chcesz wszystko wrzucać do katalogu apache to listować można korzystając z iteratorów z PHP5, np:
Kod
foreach(new DirectoryIterator('./') as $entry)
        {
        IF(!$entry->isDot())
                {
                echo $entry->getPathname().'<br />';
                }
        }
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.