De meest makkelijke manier om een binair bestand naar de server te communiceren is met behulp van de bindata componenten:
Effectie wordt deze wijze ook gebruikt om documenten in de database op te slaan in document-verwerking functionaliteit. Hier gebruik ik even de 'appendToFile'. Vreemd genoeg is in Ax 2009 (SP1) geen FileIOPermission nodig, maar dat is even niet het punt. Het punt is als het bestand te groot wordt (12MB):
"The Dynamics Ax session is no longer valid" op het moment dat de setData wordt aangeroepen. Dit gebeurd ook als je documentverwerking opslaat in de database en even het limiet hoog genoeg zet.
Je kan proberen de getData eerst toe te wijzen aan een container, maar wederom gaat bij setData dit fout.
Het bindata object heeft een methode: copyData. Leuke functie met een offset en grootte. Zou je de buffer in delen naar de server kunnen sturen, maar helaas:
Dit is zelfs erger. Deze actie zorgt ervoor dat de AOS gewoon crashed.
De enige oplossing die ik zover heb gevonden is het eerst kopieren naar een kleine buffer en die dan serverside toe te voegen:
Code:
static void Example_File2_C(Args _args)
{
BinData clientBin = ClassFactory::makeObjectOnClient(classnum(BinData));
BinData clientBinTmp = ClassFactory::makeObjectOnClient(classnum(BinData));
BinData serverBin = ClassFactory::makeObjectOnServer(classnum(BinData));
str fileName = @"C:\Ax\Client\file2.bin";
str fileNameServer = @"C:\Ax\Server\file2.bin";
int fileSize;
int offset;
int bufferSize = 1024*1024; // 1MB;
;
#file
clientBin.loadFile(fileName);
fileSize = clientBin.size();
offset = 0;
while (offset < fileSize)
{
clientBinTmp.copyData(clientBin, offset, bufferSize);
serverBin.setData(clientBinTmp.getData());
serverBin.appendToFile(fileNameServer);
offset += bufferSize;
}
info('Done!');
}
Dit behoud niet de bestandsinformatie (gemaakt op datum, NTFS beveiliging etc.) maar de data is serverside. Nog een leuke progress-bar om de gebruiker tevreden te houden en je hebt een manier.
Geen opmerkingen:
Een reactie posten