Przesyłanie plików binarnych przez ftp w Microsoft Dynamics AX 2009

Zdjęcie autora
Lindus One
Autor:
Lindus One
Data Publikacji:
Aktualizacja:

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.

Materiał archiwalny - aktualność może być ograniczona

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.

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);
}