Przesyłanie plików tekstowych przez ftp za pomocą MS Dynamics AX 2009 jest opisywane szeroko, ale w przypadku binarnych trudniej znaleźć gotowe rozwiązanie. Na potrzeby wymiany zdjęć pomiędzy Axaptą i sklepem internetowym przygotowałem metody pobierające i wysyłające pliki na serwer ftp.

Opisane tutaj przykłady zawierają metody wysyłające i pobierające pliki binarne z serwera ftp oraz przykładowy kod uruchamiający, który najlepiej umieścić jako metody statyczne we własnej klasie z tego typu narzędziami. Rozwiązanie tu opisane jest oparte na bibliotekach .NET.

Wysyłanie pliku na serwer ftp

Metoda wysyłająca plik przez ftp. Należy jej przekazać w parametrach:

  • Obiekt System.Net.NetworkCredential zawierający login i hasło do ftp
  • Ścieżkę do pliku lokalnego
  • Ścieżkę do katalogu ftp

Metoda automatycznie zmienia nazwę pliku do małych liter celem uniknięcia problemów z obsługą na systemach unixowych.

Przykład kodu uruchamiającego wysyłanie i odbieranie

Listing kodu x++ metody sendFileToFtp()

static void sendFileToFtp(System.Net.NetworkCredential _credential, FilePath _fullFilePath, URL _ftpURL)
{
    System.IO.FileStream            fileStream;
    Int                             fileStreamLength = 0;
    System.Byte[]                   bufferFile;
    ClrObject                       ftpo;//Dla potrzeb kowersji FtpWebRequest
    System.Net.FtpWebRequest        request;
    System.IO.Stream                reqStream;
    FileName                        fileName;//Nazwa pliku bez ścieżki
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();
    fileStream = System.IO.File::OpenRead(_fullFilePath);
    fileStreamLength = fileStream.get_Length();
    bufferFile = new System.Byte[fileStreamLength]();//Niezbędne nawiasy na końcu żeby ustanowienie działało w AX
    fileStream.Read(bufferFile, 0, bufferFile.get_Length());
    fileStream.Close();
    fileName = strlwr(Docu::getFileName(_fullFilePath));//nazwa z rozszerzeniem do małych liter
    ftpo = System.Net.WebRequest::Create(_ftpURL + "/" + fileName);//Najpierw tworzymy ClrObject
    request = ftpo;//następnie konwertujemy do FtpWebRequest
    request.set_Method("STOR");
    request.set_Credentials(_credential);
    reqStream = request.GetRequestStream();
    reqStream.Write(bufferFile, 0, bufferFile.get_Length());
    reqStream.Close();
    ftpo = null;
    request = null;
    bufferFile = null;
}

Pobieranie pliku z serwera ftp

Metoda pobierająca plik przez ftp. Należy jej przekazać w parametrach:

  • Obiekt System.Net.NetworkCredential zawierający login i hasło do ftp
  • Ścieżkę pod jaką ma zostać zapisany plik na dysku lokalnym
  • Ścieżkę do pliku na serwerze ftp

Listing kodu x++ metody readFileFromFtp()

static void readFileFromFtp(System.Net.NetworkCredential _credential, FilePath _fullFilePath, URL _ftpURL)
{
    System.IO.FileStream            outputFileStream;
    System.Int64                    cl;
    Int                             bufferSize = 2048;
    Int                             readCount;
    System.Byte[]                   bufferFile;
    ClrObject                       ftpwr;
    System.Net.FtpWebRequest        request;
    System.IO.Stream                ftpStream;
    System.Net.FtpWebResponse       response;
    FileName                        fileName;//Nazwa pliku bez ścieżki
    ;
    fileName = strlwr(Docu::getFileName(_fullFilePath));//nazwa z rozszerzeniem do małych liter
    new InteropPermission(InteropKind::ClrInterop).assert();
    ftpwr = System.Net.WebRequest::Create(_ftpURL + "/" + fileName);
    request = ftpwr;
    request.set_UseBinary(true);
    request.set_Method("RETR");
    request.set_Credentials(_credential);
    response = request.GetResponse();
    ftpStream = response.GetResponseStream();
    cl = response.get_ContentLength();
    bufferFile = new System.Byte[bufferSize]();
    readCount = ftpStream.Read(bufferFile,0,bufferSize);
    outputFileStream = System.IO.File::OpenWrite(_fullFilePath);
    while (readCount > 0)
    {
        outputFileStream.Write(bufferFile,0,readCount);
        readCount = ftpStream.Read(bufferFile,0,bufferSize);
    }
    ftpStream.Close();
    outputFileStream.Close();
    response.Close();
    bufferFile = null;
}

Przykład kodu uruchamiającego wysyłanie i odbieranie

Job wysyłający i pobierający plik przez ftp z pomocą wyżej pokazanych metod. Należy w nim zdefiniować własne parametry do serwera ftp oraz nazwę klasy w której zapisaliśmy metody.

Listing kodu x++ z przykładowym wykorzystaniem metod wysyłania i pobierania plików.

static void testFTP(Args _args)
{
    URL                                 ftpURL = "ftp://ftp.adres-serwera-ftp.pl";
    System.Net.NetworkCredential        credential = new System.Net.NetworkCredential("login", "haslo");
    ;
    
    //Wysyłanie pojedynczego pliku
    //MainGlobal należy zamienić na na własną nazwę klasy
    MainGlobal::sendFileToFtp(credential,"c:\\temp\\test1.exe", ftpURL);
    
    //Pobieranie pojedynczego pliku
    MainGlobal::readFileFromFtp(credential,"c:\\temp\\test2.exe", ftpURL);
}

Przypisy

Źródła zewnętrzne


Formularz kontaktowy

Dane kontaktowe

+48 663 990 838 kontakt@dynamik.pl Lokalizacja: Warszawa

Bądź z nami w kontakcie!