将PDF保存为BLOB字节数组时如何避免丢失内嵌链接?
问题排查和解决方案
BLOB字段本身是原始二进制存储,不会主动修改PDF内容,内嵌链接丢失本质是PDF字节流在读写、存储、传输的某个环节被截断或篡改,可以按以下步骤逐一排查:
- 第一步:验证本地文件读取是否完整
读完byte[] content后,直接将该字节数组写入本地新PDF文件,打开检查内嵌链接是否正常。同时对比源文件和生成文件的MD5值,如果不一致,说明读取环节就出了问题:- 确认读取的源文件本身包含完整的内嵌链接
- 排除读取前使用PDF操作库(如iText、PDFBox)修改过PDF,但未正确保存全量内容的情况
- 第二步:验证数据库存储环节是否正常
从MySQL中读取刚存的PDF字节流,写入本地文件检查链接。如果出现丢失,优先检查:- 存储用的BLOB字段类型是否足够:TINYBLOB最大256字节、BLOB最大65KB、MEDIUMBLOB最大16MB,超过对应长度要改用LONGBLOB,长度不够会直接截断字节流,导致PDF结构损坏丢内容
- 排除ORM框架自动序列化/截断byte数组的问题,可以用原生JDBC的
setBlob方法做一次写入测试,验证存储逻辑
- 第三步:验证REST API传输环节是否正常
如果数据库读出来的字节流MD5和源文件一致,问题出在传输或安卓端写入:- 优先用Base64编码二进制流后再传输,避免HTTP传输过程中特殊字符被转义篡改,安卓端收到后正确解码再写入文件
- 确认HTTP头
Content-Type设置为application/octet-stream,避免中间代理、网关对内容做额外处理
你当前贴的Files.readAllBytes读取逻辑本身没有问题,建议按上述步骤加MD5校验定位出问题的环节,只要全链路保留PDF完整字节流,内嵌链接不会丢失。
内容的提问来源于stack exchange,提问作者Emre Turan
相关产品推荐
相关产品推荐

