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
.smdwpiszesz
[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
.appmusi 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
- Dla licznego repozytorium dobrze właczyć: Repozytorium wielu plików
Przykłady¶
Wysłanie pliku na serwer¶
- Dodajemy na formę parametr z typem edycji FILE np
_upload, chyba że wiemy który plik chcemy wysłać - 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
CreateFileTransferna przykład273\plik.pdf. - Jeżeli nie ustawisz
LocalFileprzy 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
WWWi 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
DropFilesktóra w parametrach dostaje specjalnie spreparowany ciąg, który podany jakoLocalFilepozwoli 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¶
- Dodać parametr _upload o typie edycji FILE i wyciągnąć go na formę. Zarezerwować miejsce pod tą kontrolką.
- 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¶
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