Przesyłanie plików binarnych przez ftp w Microsoft Dynamics AX 2009
- 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.
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);
}