Загрузка нескольких файлов в Dynamics 365

В D365 (Microsoft Dynamics 365) мы не можем работать напрямую с папками на машине пользователя. Но что делать, если надо загрузить и обработать не один файл, а сразу несколько или целую папку с файлами? В этом нам поможет zip архив. Файл архива загружается как один файл, но работать с ним можно как с папкой.

Шаг 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!

Добавить комментарий

Sidebar