![](/img/trans.png)
[英]Associate existing entity records (competitor) to new record (opportunity) crm d365 On create message
[英]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 個不同的請求:
InitializeFileBlocksUploadRequest
UploadBlockRequest
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.