Przejdź do treści

Transfer plików

Klient Desktop (VCL)

Co trzeba wiedzieć

  • Pliki trzeba transferować, bo zwykle klient korzysta z Sente S4 na innym komputerze niż stoi serwer NEOS
  • Transfer odbywa się asynchronicznie, to znaczy, że kod neosa nie czeka aż transfer się zakończy, dostajemy tylko powiadomienia, że coś się udało albo nie udało
  • Transfer oparty jest o REPOZYTORIA, specjalnie zdefiniowane w systemie, wskazują na ścieżki w których po stronie serwera przechowywane będą pliki. Ścieżki mogą być lokalne lub zdalne, w tym drugim przypadku NEOS (np. jako usługa) musi mieć uprawnienia do zapisu i odczytu z tych katalogów

Co trzeba skonfigurować

  • Transfer idzie po protokole HTTP, stąd nawet jeżeli klient widzi jedynie Sente S4, NEOS musi mieć włączony i poprawnie skonfigurowany serwer HTTP, jeżeli NIE KORZYSTASZ W INNY SPOSÓB z WEB wystarczy, że w pliku .smd wpiszesz
[HTTPServer]
HttpServerServiceAddress=localhost:9001
  • Podany port musi być zarejestrowany w systemie na serwerze, aby NEOS mógł używać go do komunikacji po HTTP, porozmawiaj z adminem jak to zrobić lub w konsoli z prawami admina wpisz
netsh http add urlacl url=http://+:9001/ user=wszyscy
  • Podany port musi być odblokowany w firewallu na serwerze, aby NEOS mógł używać go do komunikacji po HTTP, porozmawiaj z adminem jak to zrobić lub w konsoli z prawami admina wpisz
netsh advfirewall firewall add rule name="neos www" dir=in action=allow protocol=TCP localport=9001
  • Sente S4 musi działać z Neosem, w pliku .app musi być standardowy wpis:
[RemoteClients]
RemoteClients=neos
neos:IP=192.168.1.1
neos:Port=9000
  • Zwróć uwagę, aby po adresie i porcie NIE BYŁO ŻADNYCH BIAŁYCH ZNAKÓW ani # komentarzy
  • Trzeba mieć skonfigurowane repozytoria z których się chce korzystać, NEOS musi posiadać prawa do zapisu i odczytu z tych katalogów

Przykłady

Wysłanie pliku na serwer

  1. Dodajemy na formę parametr z typem edycji FILE np _upload, chyba że wiemy który plik chcemy wysłać
  2. Dodajemy na formę akcję która posłuży do wykonania transferu, w metodzie wykonawczej umieszczamy:
var filename = Path.GetFileName(_upload);//ze ścieżki lokalnej z parametru upload pobieramy nazwę pliku na serwerze
var ti = API.CreateFileTransfer("PREZENTACJA", filename);//PREZENTACJA to nazwa repozytorium
ti.Direction = TransferDirection.UploadToServer;//Ładujemy plik na serwer
ti.LocalFile = _upload;//Ścieżka wskazująca gdzie lokalnie znajduje się plik
ti.OnError = (tinfo) => { //metoda wykonuje się gdy coś pójdzie nie tak
    API.ShowMessageBox(tinfo.Exception.Message, "Błąd");
};
ti.OnSuccess = (tinfo) => { //metoda wykona się gdy wszystko jest w porządku
    API.ShowMessageBox("Załadowano plik do "+ti.ServerFile,"OK");//wiemy gdzie plik się znalazł na serwerze
};
ti.StartAsync();//uruchomienie transferu asynchronicznie

//kod tutaj uruchomi się zanim jeszcze klient rozpocznie transfer!

Note

Jeżeli chcemy, aby plik znalazł się w konkretnym podfolderze repozytorium, należy w jego nazwie wskazać tę konkretną ścieżkę.

var filename = Path.GetFileName(_upload);
filename = Path.Combine("FV", "2024", "8", filename); // dzięki temu nasz plik trafi do ścieżki na naszym repozytorium FV\2024\8\[nazwa pliku]
var ti = API.CreateFileTransfer("PREZENTACJA", filename);

Pobranie pliku z serwera

1.Dodajemy na formę akcję która posłuży do wykonania transferu, w metodzie wykonawczej umieszczamy:

var filename = "DBR News 1_18.pdf";//musimy wiedzieć gdzie znajduje się plik na serwerze, najczęściej pamiętamy to w bazie danych
var ti = API.CreateFileTransfer("PREZENTACJA", filename);//plik będzie o podanej nazwie będzie szukany w repozytorium PREZENTACJA
ti.Direction = TransferDirection.DownloadFromServer;//pobieramy z serwera
ti.OnError = (tinfo) => { //metoda gdy coś poszło nie tak
    API.ShowMessageBox(tinfo.Exception.Message, "Błąd");
};
ti.OnSuccess = (tinfo) => { //metoda gdy wszystko się udało
    API.ShowMessageBox("Plik znajdziesz w "+ti.LocalFile,"OK");
};
ti.StartAsync(); //uruchamiamy transfer asynchronicznie

//kod tutaj wykona się przed rozpoczęciem transferu

Wideo

https://www.youtube.com/watch?v=RExxT5_MVjc

Poza tym

  • Można po transferze z serwera pokazać plik u klienta np. w Acrobat Readerze
  • Można po transferze na serwer pokazać podgląd pliku w Sente S4 osadzając to w oknie
  • Można transferować pliki w paczkach, jeżeli potrzebujemy przesłać ich więcej i wykonać akcję tylko, jeżeli wszystkie przesłały się poprawnie
  • Jeżeli plik o danej nazwie jest już w repozytorium zostanie nadpisany bez ostrzeżenia. Aby tego uniknąć generuj nazwę folderu i doklejaj ją do nazwy pliku w CreateFileTransfer na przykład 273\plik.pdf.
  • Jeżeli nie ustawisz LocalFile przy transferze do klienta plik zostanie umieszczony w katalogu %TEMP%
  • Możliwa jest obsługa załączania wielu plików jednocześnie dzięki metodzie DropFiles
  • Jeżeli na formę wyciągniemy grida, pliki przeciągnięte i upuszczone na niego mogą zostać obsłużone w DropFiles

Neos WEB

Co trzeba wiedzieć

  • Transfer odbywa się bardzo podobnie
  • Ze względów bezpieczeństwa przeglądarka BLOKUJE DOSTĘP do wszystkich plików, poza tymi, które użytkownik sam wskaże do kontrolki uploadu
  • Pliki w momencie wyboru od razu są uploadowane na serwer do repozytorium tymczasowego WWW i dostają automatyczne nazwy, aby nie kolidowały ze sobą
  • Następnie należy je przenieść do repozytorium docelowego, używając... Transferu plików.
  • Domyślnie działa to w ten sposób, że po udanym transferze do repozytorium docelowego uruchamiana jest metoda DropFiles która w parametrach dostaje specjalnie spreparowany ciąg, który podany jako LocalFile pozwoli przenieść plik do repozytorium docelowego
  • Przy pobieraniu pliku, można wpłynąć na to jak plik będzie się nazywał, ale zawsze jest pobierany do lokalizacji wybranej w przeglądarce (domyślnie folder Pobrane)
  • Kontrolka do uploadu plików wyświetla informacje o plikach w formie karteczek pojawiających się pod samą kontrolką, trzeba tam zostawić trochę miejsca. Jeżeli plików będzie za dużo, karteczki będą najeżdżać na inne kontrolki
  • Kontrolka uploadu obsługuje również przeciąganie i upuszczanie plików, ale trzeba je przeciągnąć NA KONTROLKĘ a nie na Grida jak to ma miejsce w Sente S4
  • Można również wybrać wiele plików jednocześnie

Co trzeba skonfigurować

  • Trzeba poprawnie skonfigurować klienta WEB w pliku .smd
  • Trzeba mieć skonfigurowane repozytorium WWW

Cykliczne czyszczenie tymczasowego repozytorium WWW

  • Cykliczne czyszczenie repozytorium WWW dodano aby np. w wyniku nieudanego transferu, pliki nie gromadziły się w tym repozytorium. Mechanizm czyści repozytorium WWW (usuwa pliki starsze niż podany okres i puste foldery) tak często jak ustalimy w konfiguracji w pliku *.smd.
  • Czyszczenie będzie się wykonywać także przy każdym uruchomieniu serwera.
  • Repozytorium WWW nie obsługuje mechanizmu wielu plików.
  • Konfiguracja czyszczenia w pliku *.smd znajduje się tutaj: konfiguracja czyszczenia

Przykłady

Transfer pliku na serwer

  1. Dodać parametr _upload o typie edycji FILE i wyciągnąć go na formę. Zarezerwować miejsce pod tą kontrolką.
  2. Włączyć wyświetlanie metod dziedziczonych i przeciążyć metodę DropFiles
//pliki są już w repozytorium WWW
foreach(var file in files) {//może być wiele plików
    var ti = API.CreateFileTransfer("PREZENTACJA", "");//Repozytorium docelowe to PREZENTACJA, nazwę pliku podamy później, tak jest wygodniej
    ti.Direction = TransferDirection.UploadToServer;//wysyłamy na serwer
    ti.LocalFile = file;//file jest w postaci WWW::6c44d276546b4d198a31569833939d7d_plik.png
    ti.ServerFileName = ti.OriginalFileName;//ale jak przypiszemy do LocalFile, to wszystko się magicznie rozpozna i w OriginalFileName dostaniemy plik.png
    ti.OnError = (tinfo) => {//wykona się gdy błąd
        API.ShowMessageBox(tinfo.Exception.Message, "Błąd");
    };
    ti.OnSuccess = (tinfo) => {//wykona się gdy sukces
        API.ShowMessageBox("Załadowano plik do "+ti.ServerFile,"OK");
    };
    ti.StartAsync();//rozpoczynamy asynchronicznie transfer
}

//kod umieszczony tutaj wykona się przed przeniesieniem plików do repozytorium docelowego, ale w repozytorium WWW pliki już się znajdują

Pobranie pliku z serwera

Analogicznie jak w Sente S4

Wideo

https://www.youtube.com/watch?v=PrBpGtNEL

Poza tym

  • Plik można wyświetlić użytkownikowi bezpośrednio w przeglądarce, o ile przeglądarka umie go pokazać, jak w przypadku plików pdf, png, txt itp.
  • Można to zrobić w osobnej karcie przeglądarki lub podgląd osadzić bezpośrednio w oknach aplikacji

Stara strona

Transfer plików API