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

关于TinyMCE编辑器与Dynamics365的图片存储及恢复问题咨询

嘿,我来帮你理清这个问题——在Dynamics 365里集成TinyMCE时,复制粘贴的图片确实容易遇到这种存储和持久化的坑,咱们一步步拆解解决:

一、先搞懂当前图片的临时存储逻辑

你现在粘贴图片能显示,但关闭页面就丢失,大概率是因为默认行为没做持久化处理:

  • 如果是直接粘贴图片,TinyMCE默认会把图片转成base64编码的Data URI嵌入到编辑器HTML里。但如果你的Dynamics字段(比如普通多行文本字段)不支持完整存储大体积HTML,或者保存时截断了内容,就会导致重新打开后图片丢失。
  • 少数情况是图片被临时存在Dynamics的会话级缓存里,页面关闭后缓存被清理,所以URL失效。

你可以先验证一下:打开TinyMCE的代码视图,查看图片的src属性——如果是data:image/png;base64,...格式,就是嵌入的base64;如果是HTTP URL,那就是临时存储的路径。

二、配置永久存储:把图片上传到Dynamics实体

要解决持久化问题,你需要自定义TinyMCE的images_upload_handler,让粘贴的图片自动上传到Dynamics的实体存储(比如注释附件、自定义实体的字段),再把永久URL插入到编辑器里。

这里给你一个基于Dynamics Web API的示例代码:

tinymce.init({
  selector: '#your-editor-container-id',
  plugins: 'paste image',
  // 自定义图片上传逻辑
  images_upload_handler: function (blobInfo, success, failure) {
    // 构造FormData用于上传附件
    const formData = new FormData();
    formData.append('file', blobInfo.blob(), blobInfo.filename());
    
    // 关联附件到当前Dynamics记录(这里以账户实体为例)
    const recordId = Xrm.Page.data.entity.getId().replace(/[{}]/g, '');
    formData.append('objectid@odata.bind', `/accounts(${recordId})`);
    formData.append('objecttypecode', 'account');
    formData.append('subject', 'TinyMCE编辑器图片');

    // 调用Dynamics Web API上传到注释实体
    fetch(`${Xrm.Page.context.getClientUrl()}/api/data/v9.2/annotations`, {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'OData-MaxVersion': '4.0',
        'OData-Version': '4.0'
      },
      body: formData
    })
    .then(res => res.json())
    .then(data => {
      // 获取上传后的永久图片URL
      const imageUrl = `${Xrm.Page.context.getClientUrl()}/api/data/v9.2/annotations(${data.annotationid})/filecontent?$format=application/octet-stream`;
      success(imageUrl); // 把URL插入编辑器
    })
    .catch(err => failure(`图片上传失败:${err.message}`));
  }
});

注意:要确保当前用户有创建注释(或你选择的目标实体)的权限,否则会上传失败。

三、确保编辑器内容正确保存到Dynamics字段
  1. 确认你用的是Dynamics的富文本字段(不是普通多行文本字段),只有富文本字段支持完整存储带图片标签的HTML内容。
  2. 在页面保存前,记得把TinyMCE的内容同步到对应字段:
// 保存操作触发时执行
const editorContent = tinymce.get('your-editor-container-id').getContent();
Xrm.Page.getAttribute('your-rich-text-field-name').setValue(editorContent);
四、修复已丢失的图片

如果之前已经有一些临时图片丢失,你可以写个小脚本遍历编辑器里的base64图片,批量上传到Dynamics附件后替换src属性,这样重新打开页面就能正常显示了。

另外还要检查权限:如果图片URL是Dynamics Web API的路径,要确保用户能访问对应的注释记录,否则会出现403错误导致图片加载失败。

内容的提问来源于stack exchange,提问作者GT.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:02:33