簡體   English   中英

將 PDF ( > 4 MB) 上傳到 D365 CRM 中的文件數據類型

[英]Upload PDF ( > 4 MB) to File datatype in 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 MB 的文件。 但是,如果我嘗試上傳超過 4 MB 的 PDF,我會收到以下錯誤:

無效的文件塊大小:4 MB。 支持的最大塊大小:4 MB。

有沒有辦法將 PDF 大文件上傳到 CRM 記錄?

using (var stream = new MemoryStream(Convert.FromBase64String(Base64)))
                    {
                        InitializeFileBlocksUploadRequest initializeUploadRequest = new InitializeFileBlocksUploadRequest();
                        initializeUploadRequest.FileAttributeName = "my_fileTypeField";
                        initializeUploadRequest.FileName = "Test.pdf";
                        initializeUploadRequest.Target = new EntityReference("my_entity", new Guid("my_guid"));

                        var initializeUploadResponse = (InitializeFileBlocksUploadResponse)service.Execute(initializeUploadRequest);
                        var uploadRequest = new UploadBlockRequest { FileContinuationToken = initializeUploadResponse.FileContinuationToken };

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

                        do
                        {
                            
                            //uploadRequest.BlockData = Convert.FromBase64String(documentBody);
                            byteCount = stream.Read(uploadRequest.BlockData, 0, blockSize);
                            uploadRequest.BlockId = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
                            service.Execute(uploadRequest);
                            blockList.Add(uploadRequest.BlockId);
                            Console.WriteLine(size + " == " + blockSize);
                        } while (size == blockSize);

                        var commitRequest = new CommitFileBlocksUploadRequest
                        {
                            BlockList = blockList.ToArray(),
                            FileContinuationToken = initializeUploadResponse.FileContinuationToken,
                            FileName = initializeUploadRequest.FileName,
                            MimeType = "application/pdf"
                        };
                        var commitResponse = (CommitFileBlocksUploadResponse)service.Execute(commitRequest);
                    }

UploadBlockRequest是文件上傳過程中的一部分。 您需要 3 個不同的請求:

  1. InitializeFileBlocksUploadRequest
  2. UploadBlockRequest
  3. CommitFileBlocksUploadRequest

UploadBlockRequest最多可以容納 4 MB 的數據塊。 您的文件可以大到 128 MB,並且可以使用多個上傳請求上傳。

一個基本的上傳方法可能如下所示:

private Guid UploadFile
    (
        FileStream 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);
    var uploadRequest = new UploadBlockRequest { FileContinuationToken = initializeUploadResponse.FileContinuationToken };

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

    do
    {
        byteCount = stream.Read(uploadRequest.BlockData, 0, blockSize);
        uploadRequest.BlockId = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
        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;
}

該方法上傳文件並返回文件的ID。

我稍微修改了 Henk 的示例,因為我遇到了錯誤:

緩沖區不能是 null

但是,我相信我的方法不適用於大文件。 我已經成功地為最大 5MB 的文件測試了這種方法 比這更大的文件需要使用 Henk 的方法上傳。 我自己並不是一個編碼天才,無法弄清楚如何改進 Henk 的示例以避免該錯誤。

private Guid UploadFile(byte[] fileBytes, string fileName, string mimeType, EntityReference target, string fileAttributeName, IOrganizationService ctx)
    {
        var initializeUploadRequest = new InitializeFileBlocksUploadRequest
        {
            FileAttributeName = fileAttributeName,
            FileName = fileName,
            Target = target
        };


        var initializeUploadResponse = (InitializeFileBlocksUploadResponse)ctx.Execute(initializeUploadRequest);
        var uploadRequest = new UploadBlockRequest
        {
            FileContinuationToken = initializeUploadResponse.FileContinuationToken,
            BlockData = fileBytes,
            BlockId = Convert.ToBase64String(Guid.NewGuid().ToByteArray())
        };


        var blockList = new List<string>();

        ctx.Execute(uploadRequest);
        blockList.Add(uploadRequest.BlockId);


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

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

我確實使用字節數組作為輸入而不是 stream,因為在我的解決方案中,我正在從 1 個實體(作為字節 [] 返回)下載文件,以將其上傳到另一個實體中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM