求助:从MTOM提取的二进制数据生成无效ZIP,如何解决?
解决MTOM提取ZIP二进制后写入无效的问题
以下是几个排查和解决方向:
确认二进制数据是否经过编码
MTOM中的二进制内容通常会用base64编码传输,如果提取时直接将编码后的字符串写入文件,生成的ZIP必然无效。先检查提取的数据是否为base64格式,若是则先解码再写入:// 假设$extracted_data是从MTOM中提取的编码字符串 $raw_zip_data = base64_decode($extracted_data); file_put_contents('TEST.ZIP', $raw_zip_data);检查数据提取是否完整且无冗余
MTOM包含MIME头和边界分隔符,提取时如果误将这些非ZIP内容(比如Content-Type、--boundary这类行)包含进去,会直接破坏ZIP结构。确保只提取<xop:Include>指向的纯二进制流部分,不要附带任何MIME头信息。避免字符串操作破坏二进制数据
不要对提取的二进制数据使用trim()、str_replace()这类字符串处理函数——ZIP文件的开头是固定的PK(十六进制504b0304),如果被意外修改或截断,文件就会失效。可以用以下代码验证数据开头:echo bin2hex(substr($raw_zip_data, 0, 4)); // 正常输出应为504b0304指定二进制写入模式
在Windows环境下,PHP默认的文本模式会转换换行符,导致二进制文件损坏。写入时显式指定FILE_BINARY标志:file_put_contents('TEST.ZIP', $raw_zip_data, FILE_BINARY);使用成熟的MTOM解析库
手动提取容易出错,建议用PHP的SOAP扩展自带的MTOM处理能力,或者第三方MTOM解析工具,确保完整正确地提取二进制附件。
内容的提问来源于stack exchange,提问作者Asher
相关产品推荐
相关产品推荐

