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
相关产品推荐
相关产品推荐

