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

通过WebDAV使用MS Word保存.doc文件失败:未发送PUT请求

问题描述

我正在使用webdav-server npm模块实现Node.js文件服务器,服务运行状态完全正常。
我可以通过Microsoft Word(Microsoft® Word 2016 MSO (16.0.14228.20216) 32位)正常打开、编辑并保存*.docx格式文件,也可以通过LibreOffice Writer(版本:7.0.6.2 (x64))正常操作.odt*格式文件。
抓取Microsoft Word和LibreOffice Writer发起的请求可知,正常操作的请求顺序为GET - LOCK - PUT - UNLOCK,分别对应打开文件(GET)、关闭只读模式(LOCK)、保存修改内容(PUT)、关闭文本编辑器(UNLOCK)。
使用Word编辑保存.docx文件的请求流量

但当我使用Microsoft Word编辑并保存*.doc*格式文件时,点击保存按钮后并未发送PUT请求,因此关闭应用后修改内容全部丢失。且点击保存按钮后MS Word没有给出任何反馈,既不提示保存成功也不提示保存失败。
使用Word编辑保存.doc文件的请求流量

另一方面,我使用LibreOffice Writer打开*.doc文件时,可以正常发起PUT请求,符合预期。
我也尝试过修改MS Word的设置,将默认保存格式从MS Word 2016默认的
.docx改为.doc*,但问题仍然没有解决。
请问有人知道问题可能出在哪里吗?我无法理解为什么MS Word处理.doc格式文件时不会发送PUT请求,处理.docx格式时却可以正常发送?
(项目要求必须兼容*.doc*文件,最好可以同时支持LibreOffice和MS Word操作)
提前感谢大家的帮助!


问题原因&解决方案

这是MS Word对不同格式文件的WebDAV交互逻辑差异导致的问题,和服务基础运行配置无关,可以按照以下几个方向排查修复:

  • PROPPATCH请求支持缺失:老旧的*.doc二进制格式的保存流程比.docx*多一步元数据写入校验,Word会先发送PROPPATCH请求尝试写入文件的自定义属性,如果该请求返回4xx/5xx错误,Word会静默终止后续保存流程,不会抛出任何错误提示。
    你可以在初始化webdav-server时,明确开启文件元数据存储支持即可解决,示例配置如下:
    const { WebDAVServer, PhysicalFileSystem } = require('webdav-server');
    const server = new WebDAVServer();
    
    // 启用物理文件系统的元数据持久化,支持PROPPATCH请求写入自定义属性
    server.setFileSystem('/', new PhysicalFileSystem('/你的本地文件存储目录', {
      enableMetadataStorage: true
    }));
    
  • 响应头校验不通过:Word保存*.doc*文件前会先发送HEAD请求校验文件的Last-Modified和ETag字段,如果这两个字段和之前GET请求返回的数值不一致,Word会认为文件已被第三方篡改,放弃写入。你需要检查webdav-server的响应头配置,不要手动修改这两个字段的返回值,确保HEAD和GET请求返回的对应字段完全一致。
  • 临时文件权限限制:Word保存*.doc*格式时会先生成后缀为.tmp的临时文件,写入完成后再重命名替换原文件,如果你的服务限制了.tmp格式文件的写入权限,也会导致保存流程中断。你需要放开临时文件的写入权限,允许Word上传.tmp格式的文件。

你可以先抓包查看点击保存后Word发出的非PUT请求的响应状态码,优先处理状态码异常的请求即可快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:00:05