Загрузка нескольких файлов в Dynamics 365
В D365 (Microsoft Dynamics 365) мы не можем работать напрямую с папками на машине пользователя. Но что делать, если надо загрузить и обработать не один файл, а сразу несколько или целую папку с файлами? В этом нам поможет zip архив. Файл архива загружается как один файл, но работать с ним можно как с папкой.
Contents
Шаг 1. Добавим контрол
Вначале добавим контрол в диалог для загрузки файла. Для удобства добавления, контрол можно вынести в отдельный метод.
protected void addFileUploadControlToDialog(DialogRunbase _dialog)
{
//сделаем отдельную группу в диалоге
DialogGroup dialogGroup = _dialog.addGroup("@SYS54759");
FormBuildControl formBuildControl = _dialog.formBuildDesign().control(dialogGroup.name());
FileUploadBuild dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), 'FileUpload');
dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);
//Зададим шаблон загружаемых файлов
dialogFileUpload.fileTypesAccepted('.zip');
dialogFileUpload.baseFileUploadStrategyClassName(
classstr(FileUploadTemporaryStorageStrategy));
dialogFileUpload.fileNameLabel("@SYS308842");
}
Шаг 2. Перекроем метод dialogPostRun
Далее необходимо перекрыть метод dialogPostRun, где пропишем код по загрузке файла. Используем переменную типа FileUpload.
public void dialogPostRun(DialogRunbase _dialog)
{
fileUpload = _dialog.formRun().control(_dialog.formRun().controlId('FileUpload'));
fileUpload.notifyUploadCompleted += eventhandler(this.uploadCompleted);
this.setDialogOkButtonEnabled(_dialog, false);
}
Шаг 3. Завершим загрузку
Завершение загрузки и получение потока System.IO.Stream streamzip;
public void uploadCompleted()
{
streamzip = fileUpload.getUploadedFile(true);
fileUpload.notifyUploadCompleted -= eventhandler(this.UploadCompleted);
this.setDialogOkButtonEnabled(dialog, true);
}
setDialogOkButtonEnabled — выполняет очень полезную функцию. Делает неактивной кнопку «OK» на диалоге, пока не завершится загрузка файла. Это необходимо сделать для предотвращения ошибок из-за действия пользователя.
private void setDialogOkButtonEnabled(DialogRunbase _dialog, boolean _isEnabled)
{
FormControl okButtonControl = this.getFormControl(_dialog, OkButtonName);
if (okButtonControl)
{
okButtonControl.enabled(_isEnabled);
}
}
Шаг 4. Пользуемся файлами
Полученный архив можно перебрать и выполнить действия с файлами. Необходимо использовать библиотеку.
using System.IO.Compression;
public void run()
{
ZipArchive zipArchive = new ZipArchive(streamzip);
ZipArchiveEntry entry;
var enumerator = zipArchive.Entries.GetEnumerator();
System.IO.Stream unzippedStream;
try
{
while (enumerator.MoveNext())
{
stream = new System.IO.MemoryStream();
entry = enumerator.Current;
unzippedStream = entry.Open();
unzippedStream.CopyTo(stream);
this.processingFile(stream); //Ваш метод обработки файла
Info(strFmt("@SYS119504", "@SYS98072"));
}
}
Comments
So empty here ... leave a comment!