Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c#][ASP.NET] - Portal muzyczny - kilka pytań teoretycznych na wstęp

danon198901 24 Mar 2014 15:35 1542 14
  • #1 24 Mar 2014 15:35
    danon198901
    Poziom 11  

    Witam,

    chciałbym zrobić od podstaw swój własny portal muzyczny, ale na wstępie już pojawiło się kilka pytań, na które mam nadzieję uzyskam odpowiedź.

    W chwili obecnej zrobiłem sobie kompletnego css, master page, logowanie itp.
    Portal miałby mieć możliwość załączenia własnych plików *.mp3, każdy mógłby wyszukać dostępne utwory, przeglądać historię utworów czy też najpopularniejsze kawałki. Czyli tutaj oczywiście kłania się baza danych, z tym, że nie wiem w jaki sposób przechowywać najlepiej te pliki muzyczne? Strzelam, że np. każdy zarejestrowany użytkownik miałby swój własny folder i do niego wrzucać pliki dodatkowo załączyć informacje o tytule/wykonawcy/osobie dodającej etc do bazy danych, ale ręki uciąć sobie nie dam. Wszelkie sugestie mile widziane;)

    Pozdrawiam

    0 14
  • Pomocny post
    #2 24 Mar 2014 17:34
    rufek90
    Poziom 23  

    Możesz trzymać id użytkownika w tabeli z utworem. Możesz również połączyć tabelę użytkowników z tabelą utworów poprzez tabelę pośredniczącą, gdzie trzymasz id użytkownika i id utworu. Zapoznaj się z podstawami projektowania baz danych, może się przydać.

    Edit: Folderów 'fizycznie' nie musisz tworzyć. Każdemu uploadowanemu utworowi zmieniasz nazwę na randomową (niepowtarzalną), a nazwę pliku zapisujesz w bazie i łączysz z użytkownikiem i folderem. Trzymasz też tabelę folder gdzie zapisujesz nazwę i podfolder (jeśli istnieje).

    0
  • Pomocny post
    #3 24 Mar 2014 17:37
    marcinj12
    Poziom 40  

    Dokładnie tak, nie ma chyba sensu przechowywanie plików w bazie danych. Użytkownik powinien móc uploadować plik ze swojego komputera, zaś rozszerzone informacje o nim musisz jednocześnie wprowadzić do bazy.

    Jak rozwiążesz organizacją plików na serwerze, to już Twój pomysł - w najprostszej wersji przechowuj pliki w jednym katalogu i nazywaj je tak, jak automatycznie numerowane ID w bazie danych. Wszystkie informacje, takie jak nazwa pliku, nazwa utworu czy użytkownik, który go dodał, przechowuj w bazie.

    Walczyłem z podobnym tematem jakiś czas temu i muszę powiedzieć, że znalezienie dobrego uploadera plików pod asp.net graniczy z cudem - przetestowałem kilkanaście dostępnych rozwiązań, i z każdym było coś nie tak... Wymóg był taki, żeby:
    - był darmowy :)
    - dawał się wystylizować,
    - miał pasek postępu przy wysyłaniu pliku na serwer,
    - posiadał ograniczenie rozmiaru ładowanego pliku,
    - był w miarę kompatybilny między przeglądarkami
    Dostępne rozwiązania albo nie miały dobrze działającego paska postępu, albo nie miały walidacji rozmiaru, albo korzystały z rozwiązań typu Flash, co bywało problematyczne...

    W końcu machnąłem na to ręką (na szczęście mogłem...), zrobiłem walidację po stronie serwera i wystylizowałem standardowy uploader z pomocą jQuery UI. Ale jakby co, to najciekawiej wyglądał ten plugin jQuery: http://blueimp.github.io/jQuery-File-Upload/, choć nie pamiętam już czemu go odrzuciłem... :)

    Pamiętam też że były jakieś problemy z ustawieniem uprawnień serwera IIS, żeby mógł zapisywać pliki, ale dało się wygooglać rozwiązanie.

    0
  • #4 24 Mar 2014 20:14
    danon198901
    Poziom 11  

    W takim razie pliki wrzucać będę do jednego folderu, a konkretny plik indentyfikować będę poprzez ID/GUID. Co do uploadowania, już kilka ciekawych rzeczy odnośnie ASP.NET wygooglałem. Strasznie to nie wygląda, a jak to wyjdzie w praktyce, czas pokaże:)
    To teraz największym orzechem do zgryzienia pozostaje zaprojektowanie bazy danych (a bazy danych w zasadzie liznąłem). W czasie wolnym od obowiązków postaram się zaprojektować takową i okażę ją do weryfikacji ze strony ludzi bardziej ogarniętych w temacie (czyt. was):D

    Póki co dziękuję za cenne informacje:)

    0
  • #5 05 Kwi 2014 14:41
    danon198901
    Poziom 11  

    @EDIT Tamten problem nieaktualny

    Jeden orzech do rozgryzienia mam teraz. Otóż mam webform oparty o master page z playerem mp3 pod flasha. Kod wygląda pi razy drzwi następująco:

    Kod: html4strict
    Zaloguj się, aby zobaczyć kod


    Mój problem w chwili obecnej polega na tym, że chciałbym, aby po wczytania strony za każdym razem zmieniała się linijka:
    Kod: html4strict
    Zaloguj się, aby zobaczyć kod

    a dokładniej rzecz ujmując samo value (które opiera się o zmienną sesji).
    Kombinowałem na wiele sposobów zmienić wartość, np. w Load_Page (cs.aspx) mam coś takiego:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    o ile do zmiennej title dostęp miałem, o czym świadczy wcześniejszy kod (a dokładniej <h1><%= title %></h1>) , o tyle z value już nie jest tak łatwo.

    Znalazłem kod w JS (jednak w JS się nie bawiłem) i spróbowałem go dodać do strony umieszczając kod bezpośrednio w ContentPlaceHolder1:
    Kod: html4strict
    Zaloguj się, aby zobaczyć kod


    Jednak nadal nie zmienia się value. Może coś robię źle, ale kombinowałem już na wiele sposobów i za nic nie mogę zmieniać value dla param name=FlashVars. Jest to dla mnie ważne, powiem wyszukuję utwory, które wypisuje na gridView i po kliknięciu na interesujący mnie wiersz w tabeli otwiera mi stronkę w nowej zakładce, gdzie mógłbym odsłuchać utwór. Pozostaje mi tylko przekazać nazwę utworu (którym de facto jest id) jako ten piekielny value... :|

    0
  • Pomocny post
    #6 05 Kwi 2014 22:42
    marcinj12
    Poziom 40  

    Ale z czym tu walczyć? ;)
    Robisz prawie tak samo:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #7 05 Kwi 2014 23:24
    danon198901
    Poziom 11  

    marcinj12 napisał:
    Ale z czym tu walczyć? ;)
    Robisz prawie tak samo:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    próbowałem:
    danon198901 napisał:
    o ile do zmiennej title dostęp miałem, o czym świadczy wcześniejszy kod (a dokładniej <h1><%= title %></h1>) , o tyle z value już nie jest tak łatwo.


    z tym, że ową zmienną number dopisywałem jako tekst do labela, żeby sprawdzić czy przesyła id:
    Kod: html4strict
    Zaloguj się, aby zobaczyć kod


    Fakt, umieszczenie <%= number %> w value jest poprawne i śmiga wszystko...ale dlaczego to samo dla textu w label jest już niepoprawne?
    Szkoda tylko, że nie sprawdziłem tego od razu na <param value> tylko na labelu, nie musiałbym spamować o pomoc :? Tyle czasu w plecy, a rozwiązanie trywialne - tak jak się spodziewałem...

    Tak czy owak, dzięki wielkie za pomoc:)

    0
  • Pomocny post
    #8 05 Kwi 2014 23:43
    marcinj12
    Poziom 40  

    danon198901 napisał:
    .ale dlaczego to samo dla textu w label jest już niepoprawne?
    A jaki to w ogóle ma sens? W tagach serwera nie stosuje się <%= %>. Odwołać się do textu kontrolki label z code behind można bezpośrednio:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Kod tego playera jest zwykłym HTMLowym tekstem i tam taki tag można zastosować.

    0
  • #9 09 Kwi 2014 20:38
    danon198901
    Poziom 11  

    Nowy problemik mam;/

    W Page_Load wrzucam sobie kod:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    I jak się okazuje za każdym razem dostaję informacje, że plik nie istnieje, gdy fizycznie jest on w katalogu. Przekonałem się o tym, gdy na twardo, bez sprawdzania, ustawiłem sobie:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ktoś mi może powiedzieć dlaczego File.Exists zwraca mi za każdym razem false mimo, że dany plik w katalogu jest? Nie wiem, czy być może jest to przyczyna tego błędu, ale spróbowałem sobie zwrócić pełną ścieżkę do katalogu:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    I moim oczom nie ukazał się napis: C:/Użytkownicy/Dokumenty....../avatars, a C:\Program Files (x86)\IIS Express\~\avatars. Jeżeli to jest przyczyną to w takim razie jak to obejść, żeby sprawdzić czy ten plik istnieje w katalogu projektu (i nie chodzi mi tu o wpisanie na twardo pełnej ścieżki, bowiem później całość powędruje na serwer zewnętrzny)?

    0
  • #10 09 Kwi 2014 21:03
    marcinj12
    Poziom 40  

    danon198901 napisał:
    I moim oczom nie ukazał się napis: C:/Użytkownicy/Dokumenty....../avatars, a C:\Program Files (x86)\IIS Express\~\avatars.
    Prawidłowo. Znak tyldy: ~ jest rozwiązywany jako ścieżka do wirtualnego katalogu serwera IIS, czyli katalogu "root" projektu.
    Jeżeli projekt ma być przenośny, powinieneś utworzyć wszystkie katalogi wewnątrz projektu (w designerze, tam gdzie wstawiasz pliki, możesz też wstawiać foldery) i wtedy odwołując się do ~/nazwa_katalogu.
    Generalnie proponuję poeksperymentować z ~ i ., bo niektóre tagi rozwiązują tą nazwę same, inne nie.

    0
  • #11 09 Kwi 2014 23:06
    danon198901
    Poziom 11  

    Wszystkie katalogi (dla avatarów, utworów, javascriptów itp) tworzyłem wewnątrz katalogu projektu właśnie w solution explorer.
    Odwołuję się do nich właśnie przez znak "~" i problemów żadnych nie było do tej pory. Tego typu przykładów, poprawnie zresztą działających, mógłbym podać kilka, ze swojego projektu. Problem tylko z tym File.Exists miałem. Gdzieś na forum anglojęzycznym znalazłem informację jakoby exists zwracał false w momencie, gdy ścieżka jest za długa. Rozwiązaniem były własne funkcje sprawdzające istnienie pliku, jednak problem udało mi się rozwiązać zdecydowanie łatwiej - poprzez Server.MapPath:)
    Tak czy siak, dzięki raz jeszcze za zainteresowanie;)

    0
  • #12 10 Kwi 2014 00:33
    marcinj12
    Poziom 40  

    Sama funkcja File.Exists nie potrafi rozwiązać znaku tyldy. Do tego trzeba jej użyć w połączeniu np. z Server.MapPath.

    0
  • #13 11 Kwi 2014 16:42
    danon198901
    Poziom 11  

    W zasadzie ukończyłem już wszystko co chciałem, pozostało mi poprawić elementy graficzne i być może spróbuję pobawić się flashem, żeby zrobić coś własnego (może player jak się uda?:))

    Obecnie mam mały problemik, który mnie irytuje, bowiem jeżeli użytkownik ma obrazek profilowy (avatar) i sobie go zmieni na inny to w oknie profilowym nadal wyświetla mi obrazek stary (dodam, że zgodnie z wcześniejszym kodem obrazki mają nazwę taką samą jak ID użytkownika). Poszperałem u wujka googla jednak żadne proponowane rozwiązania nie skutkowały. W zasadzie to czasem działa, a czasem nie działa odświeżanie obrazka, gdy zastosowałem po kliknięciu aktualizacji profilu:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Nie mniej nie zawsze na nowo wczytuje mi, więc problem uważam za nierozwiązany. Dopiero kiedy wyloguję i ręcznie wejdę w opcję przeglądarki i wyczyszczę pamięć podręczną to wczytuje zaktualizowany obrazek.
    Jakieś pomysły?

    0
  • #15 11 Kwi 2014 23:45
    danon198901
    Poziom 11  

    Dzięki wielkie, po problemie;)

    0