需手动用actix-multipart提取multipart表单中的XML文件字节流,再通过quick-xml安全解析(禁用DTD、限制大小),最后持久化并返回JSON响应。
如果您在使用 Actix-web 构建 Rust Web 服务时需要接收并解析用户通过多部分表单(multipart/form-data)上传的 XML 文件,则需手动提取文件字节流并交由 XML 解析器处理。以下是实现该功能的具体步骤:
一、启用 multipart 支持并接收文件流
Actix-web 默认不自动解析 multipart 请求体,需借助 actix-multipart crate 提供的 Multipart 类型逐段读取字段,识别 name 属性为文件字段的 Part,并收集其全部字节数据。
1、在 Cargo.toml 中添加依赖:actix-multipart = “0.5” 和 quick-xml = { version = “0.34”, features = [“serialize”] }。
2、定义异步处理函数,参数类型为 Multipart,用于遍历请求中的每个 Part。
3、调用 next() 方法迭代 Part,使用 content_disposition() 检查 header 是否包含 filename 属性以确认是否为文件字段。
4、对匹配的 Part 调用 into_bytes() 获取完整二进制内容,确保 XML 数据完整载入内存。
二、使用 quick-xml 解析上传的 XML 字节流
获取到文件原始字节后,可使用 quick-xml 的 Reader 对其进行无分配或低分配解析,支持事件驱动(XmlReader)或反序列化(de::from_reader)两种路径,适用于不同结构复杂度的 XML。
1、若 XML 结构固定,定义对应结构体并派生 Deserialize trait。
2、将字节切片转换为 &[u8],传入 quick_xml::de::from_reader 进行反序列化。
3、若结构动态或需校验格式,创建 XmlReader::from_reader 实例,循环调用 read_event() 处理 Start, Text, End 等事件。
4、捕获 quick_xml::errors::quick_xml::events::BytesStart 中的 tag 名称与属性,按需构建中间表示。
三、验证 XML 内容合法性并拒绝恶意输入
直接解析不可信的 XML 存在 XXE(XML External Entity)攻击风险,必须禁用外部实体解析并限制文档深度与大小,防止 DoS 攻击。
1、构造 quick_xml::reader::ReaderConfig 实例,设置 trim_text(true) 和 check_comments(false)。
2、调用 disable_dtd() 方法显式关闭 DTD 解析能力,阻止 声明触发的外部实体加载。