Business Central动作上传至SharePoint的PDF报表无法预览问题求助
问题根源分析
- 二进制流错误使用文本编码:PDF是二进制文件,代码中创建流时指定
TEXTENCODING::UTF8会破坏PDF的二进制结构,导致SharePoint无法识别文件内容。 - 流操作逻辑错误:执行
System.CopyStream(out, ins)会把InStream数据写回OutStream,导致后续读取InStream时指针位置异常,上传的文件数据不完整或损坏。 - 缺少正确的请求头:未设置
Content-Type: application/pdf,SharePoint无法识别文件类型,无法生成预览。
修改后的完整代码
procedure UploadFile(AccessToken: Text; Url: Text; Item: Record Item): Boolean var Client: HttpClient; Headers: HttpHeaders; RequestMessage: HttpRequestMessage; ResponseMessage: HttpResponseMessage; RequestContent: HttpContent; ResponseText: Text; IsSucces: Boolean; ItemVendor: Record "Item Vendor"; out: OutStream; ins: InStream; TempBlob_lRec: Codeunit "Temp Blob"; begin // 设置请求头 Headers := Client.DefaultRequestHeaders(); Headers.Add('Authorization', StrSubstNo('Bearer %1', AccessToken)); Headers.Add('Accept', 'application/json;odata=nometadata'); // 获取Item Vendor记录,不存在则直接返回失败 if not ItemVendor.Get(Item."Vendor No.", Item."No.") then exit(false); // 准备请求消息 RequestMessage.SetRequestUri(Url); RequestMessage.Method('POST'); // 生成PDF到TempBlob(使用二进制流,不指定文本编码) TempBlob_lRec.CreateOutStream(out); Report.SaveAs(Report::"Item/Vendor Catalog", '', ReportFormat::Pdf, out); // 从TempBlob获取InStream(二进制流) TempBlob_lRec.CreateInStream(ins); // 设置请求内容及正确的Content-Type RequestContent.WriteFrom(ins); RequestContent.GetHeaders().Add('Content-Type', 'application/pdf'); RequestMessage.Content(RequestContent); // 发送请求并处理响应 if Client.Send(RequestMessage, ResponseMessage) then begin if ResponseMessage.IsSuccessStatusCode() then begin ResponseMessage.Content.ReadAs(ResponseText); IsSucces := true; end else begin ResponseMessage.Content.ReadAs(ResponseText); // 可在此添加错误日志记录逻辑 end; end; exit(IsSucces); end;
额外注意事项
- 确认上传URL格式正确:SharePoint文件上传API需使用标准格式,例如:
https://<你的租户>.sharepoint.com/sites/<你的站点>/_api/web/GetFolderByServerRelativeUrl('Shared%20Documents/目标文件夹')/Files/add(overwrite=true,url='ItemVendorReport.pdf') - 确保AccessToken拥有SharePoint站点的文件写入权限。
内容的提问来源于stack exchange,提问作者Henrique Araújo
相关产品推荐
相关产品推荐

