Загрузить 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 разных запроса:
-
InitializeFileBlocksUploadRequest
-
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;
}
Метод загружает файл и возвращает идентификатор файла.