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

XPages中CKEditor插入含非ASCII字符图片致邮件损坏求助

解决XPages富文本插入含非ASCII字符图片导致MIME文件名错乱问题

问题根源

XPages默认的<xp:inputRichText>组件集成的CKEditor在处理非ASCII文件名的图片上传时,未按照MIME标准(RFC 2231/RFC 5987)对文件名进行编码,导致生成的MIME头中文件名乱码,最终引发邮件损坏。

解决方案

1. 自定义CKEditor图片上传处理逻辑

替换默认的上传行为,手动对文件名进行MIME编码:

  • 创建上传处理XAgent(如uploadImage.xsp),后端Java代码示例:
import javax.mail.internet.MimeUtility;
import com.ibm.xsp.model.UploadedFile;
import org.json.JSONObject;

public void beforeRenderResponse() {
    UploadedFile uploadedFile = (UploadedFile) facesContext.getExternalContext().getRequestMap().get("upload");
    if (uploadedFile == null) return;

    // 获取原始文件名并进行MIME编码
    String originalFileName = uploadedFile.getClientFileName();
    String encodedFileName = MimeUtility.encodeText(originalFileName, "UTF-8", "B");

    // 将文件保存为文档附件
    Document doc = database.createDocument();
    doc.replaceItemValue("Form", "ImageAttachment");
    EmbeddedObject embObj = doc.attachObject(encodedFileName, uploadedFile.getServerFileName(), "image/jpeg", true);
    doc.save();

    // 返回CKEditor要求的JSON响应
    JSONObject json = new JSONObject();
    json.put("uploaded", 1);
    // 生成附件访问URL
    String fileUrl = "/.ibmmodres/domino/OpenAttachment.nsf/" + doc.getUniversalID() + "/$File/" + encodedFileName + "?Open";
    json.put("url", fileUrl);

    facesContext.getExternalContext().getResponse().setContentType("application/json");
    facesContext.getExternalContext().getResponse().getWriter().write(json.toString());
    facesContext.responseComplete();
}
  • 修改<xp:inputRichText>组件配置,指定自定义上传地址:
<xp:inputRichText id="bodyRichText" value="#{document1.Body}">
    <xp:this.dojoAttributes>
        <xp:dojoAttribute name="extraPlugins" value="uploadimage"></xp:dojoAttribute>
        <xp:dojoAttribute name="filebrowserImageUploadUrl" value="/uploadImage.xsp"></xp:dojoAttribute>
    </xp:this.dojoAttributes>
</xp:inputRichText>

2. 保存文档时修正MIME头文件名

如果无法替换上传逻辑,可在文档保存后遍历MIME实体,手动修正文件名编码:

import javax.mail.internet.MimeUtility;
import lotus.domino.MIMEEntity;
import lotus.domino.Document;

public void saveDocument() {
    Document doc = document1.getDocument();
    MIMEEntity bodyEntity = doc.getMIMEEntity("Body");
    if (bodyEntity == null) return;

    MIMEEntity childEntity = bodyEntity.getFirstChildEntity();
    while (childEntity != null) {
        String dispHeader = childEntity.getHeaderVal("Content-Disposition");
        if (dispHeader != null && dispHeader.contains("filename=")) {
            // 提取原始文件名
            String rawFileName = dispHeader.substring(dispHeader.indexOf("filename=") + 9);
            rawFileName = rawFileName.replace("\"", "");
            // 重新编码文件名并设置新的Content-Disposition头
            String encodedFileName = MimeUtility.encodeText(rawFileName, "UTF-8", "B");
            childEntity.setHeaderVal("Content-Disposition", "inline; filename*=UTF-8''" + encodedFileName);
        }
        childEntity = childEntity.getNextSibling();
    }
    doc.save(true, true);
}

3. 确保页面编码为UTF-8

在XPage的属性面板中,设置contentType为text/html;charset=UTF-8,避免编码转换过程中出现乱码。

内容的提问来源于stack exchange,提问作者Andre Krepsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:10:32