Загрузить PDF (> 4 МБ) в тип данных File в D365 CRM

Я пытаюсь загрузить файл PDF в запись CRM. Я использовал поле типа файла в сущности, которая может содержать мой загруженный файл. Я сделал это с помощью этого кода:

      UploadBlockRequest blockRequest = new UploadBlockRequest();
blockRequest.BlockData = Convert.FromBase64String(documentBody);
blockRequest.BlockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()));
blockRequest.FileContinuationToken = initResponse.FileContinuationToken;

var blockResponse = (UploadBlockResponse)service.Execute(blockRequest);

Он отлично работает с файлами PDF размером менее 4 МБ. Однако если я попытаюсь загрузить PDF-файл размером более 4 МБ, я получаю следующую ошибку:

Неверный размер блока файла: 4 МБ. Максимальный поддерживаемый размер блока: 4 МБ.

Есть ли способ загрузить большие файлы PDF в запись CRM?

1 ответ

UploadBlockRequest — это часть процедуры загрузки файла. Вам нужно 3 разных запроса:

  1. InitializeFileBlocksUploadRequest
  2. CommitFileBlocksUploadRequest

The UploadBlockRequestможет содержать максимум 4 МБ данных. Ваш файл может иметь размер до 128 МБ и может быть загружен с помощью нескольких запросов на загрузку.

Базовый метод загрузки может выглядеть так:

      private static Guid UploadFile
    (
        Stream stream,
        string fileName,
        string mimeType,
        EntityReference target,
        string fileAttributeName,
        IOrganizationService organizationService
    )
{
    var initializeUploadRequest = new InitializeFileBlocksUploadRequest
    {
        FileAttributeName = fileAttributeName,
        FileName = fileName,
        Target = target
    };

    var initializeUploadResponse = (InitializeFileBlocksUploadResponse)organizationService.Execute(initializeUploadRequest);

    const int blockSize = 4194304; // 4 MB
    int byteCount;
    var blockList = new List<string>();

    do
    {
        var buffer = new byte[blockSize];
        byteCount = stream.Read(buffer, 0, blockSize);

        if (byteCount < blockSize)
            Array.Resize(ref buffer, byteCount);

        var uploadRequest = new UploadBlockRequest
        {
            BlockData = buffer,
            BlockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString("N"))),
            FileContinuationToken = initializeUploadResponse.FileContinuationToken
        };

        organizationService.Execute(uploadRequest);
        blockList.Add(uploadRequest.BlockId);
    } while (byteCount == blockSize);

    var commitRequest = new CommitFileBlocksUploadRequest
    {
        BlockList = blockList.ToArray(),
        FileContinuationToken = initializeUploadResponse.FileContinuationToken,
        FileName = initializeUploadRequest.FileName,
        MimeType = mimeType
    };

    var commitResponse = (CommitFileBlocksUploadResponse)organizationService.Execute(commitRequest);
    return commitResponse.FileId;
}

Метод загружает файл и возвращает идентификатор файла.

Другие вопросы по тегам