You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Business Central动作上传至SharePoint的PDF报表无法预览问题求助

Business Central上传PDF到SharePoint无法预览的解决方法

问题根源分析

  1. 二进制流错误使用文本编码:PDF是二进制文件,代码中创建流时指定TEXTENCODING::UTF8会破坏PDF的二进制结构,导致SharePoint无法识别文件内容。
  2. 流操作逻辑错误:执行System.CopyStream(out, ins)会把InStream数据写回OutStream,导致后续读取InStream时指针位置异常,上传的文件数据不完整或损坏。
  3. 缺少正确的请求头:未设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:45:37