首页 > ODOO > 正文

泛微 E9 附件上传失败怎么办?分层排查实战

fenij 2026-08-06 1 ODOO

用户在流程里点「上传附件」,转圈半天弹一个红框报错;或者进度条走到 100% 之后什么都没发生,刷新页面附件不在。泛微 E9 的附件上传涉及浏览器、前置代理、应用服务器、磁盘、数据库好几层,任何一层出问题表现都差不多,所以不能凭感觉猜,得按层排。

第一步:分清楚卡在哪个环节

让用户复现一次,你在旁边按 F12 打开 Network 面板盯着看。三种情况指向完全不同的方向:

  • 请求根本没发出去 → 前端脚本报错或浏览器拦截
  • 请求发出去了,返回 413 → 前置 Nginx/Apache 的请求体大小限制
  • 返回 500 或超时 → 应用服务器、磁盘或数据库层面的问题

顺便让用户换个浏览器和换个文件再试一次。如果只有某个人、某个文件、某种后缀失败,范围一下就缩小了。

413:先看前置代理的大小限制

大多数 E9 环境前面都挂了一层 Nginx 做反代。Nginx 默认只允许 1MB 的请求体,用户传个 5MB 的 PDF 就直接被打回来了。改配置:

client_max_body_size 200m;
client_body_timeout 300s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;

写在 http 段或对应的 server 段里,然后 nginx -t && nginx -s reload。超时那几项别忘了,大文件在慢网络下很容易先撞超时再撞大小限制。

应用服务器这一层:Resin 的上传上限

E9 通常跑在 Resin 上。Resin 对表单上传也有自己的限制,改 resin/conf/resin.conf,在 web-app 或 server 配置块里确认这几项:

<form-upload-max>209715200</form-upload-max>
<form-parameter-max>10000</form-parameter-max>

单位是字节,209715200 就是 200MB。改完必须重启 Resin 才生效,reload 不管用。如果你的环境是 Tomcat 部署,对应的是 maxPostSize,逻辑一样。

磁盘和目录权限:最常见也最容易忽略

这一类问题的典型症状是「昨天还好好的,今天突然全员传不上去」。先看磁盘:

df -h
df -i

空间满了会传不上,inode 用尽同样会传不上,而且第二种更隐蔽——df -h 显示还有几十 G,但小文件太多把 inode 耗光了,一样写不进去。

附件的实际存放路径在后台「系统管理 → 系统设置 → 附件存储设置」里能查到,很多环境放在 /data/ 或 ecology 同级目录下的 filesystem 里。确认这个目录的属主是运行 Resin 的那个系统用户:

ls -ld /data/filesystem
chown -R weaver:weaver /data/filesystem

如果服务是 root 起的就用 root 的属主,关键是要和实际运行用户对上。有些站点做过安全加固,把目录权限改成了 750 但没同步改属组,就会出现这种「不报错但写不进」的怪现象。

集群环境:附件目录有没有共享

多节点部署时,如果附件目录没做 NFS 或共享存储,用户在 A 节点上传成功,下次请求被负载均衡分到 B 节点,就找不到文件了。表现是「有时候能看有时候看不了」,很有迷惑性。用 mount | grep nfs 确认一下挂载状态,再到两个节点上分别 ls 同一个附件路径对比。

去日志里找准确原因

猜到这一步就够了,剩下的交给日志。Resin 的日志在 resin/log/ 下,ecology 自己的日志在部署目录的 log/ 里。上传失败的当口去 tail:

tail -f resin/log/jvm-app-0.log
tail -f ecology/log/ecology.log

让用户再传一次,看刷出来什么异常。常见的有 IOException(权限或空间)、SQLException(附件表写入失败,E9 里附件元信息主要落在 ImageFile 相关表)、以及 OutOfMemoryError(JVM 堆不够,大文件上传时容易触发,改 Resin 启动参数的 -Xmx)。

特定后缀传不上,是被规则挡了

如果只有 .exe、.zip、.js 之类的文件失败,其它正常,那不是故障是设定。后台的附件安全设置里有允许/禁止的扩展名清单,运维加固时经常会收紧它。另外服务器上的杀毒软件和 WAF 也会拦特定类型,先临时停掉 WAF 试一次就能确认是不是它干的。

常见问题

问:只有个别用户传不上,其他人都正常,还需要查服务器吗?
基本可以排除服务端。优先看这个人的浏览器版本、是否开了兼容模式、有没有装拦截插件,以及他所在的网络出口是不是有设备限制上传大小。让他换台机器试一下最快。

问:改了 Nginx 的 client_max_body_size 还是 413,为什么?
两种可能:一是配置写错了位置,被更靠内层的 location 段覆盖了;二是链路上不止一层代理,比如前面还有个 F5 或云 WAF,每一层都得改。用 curl -v 直接打后端端口绕过代理测一次,就知道是哪一层拦的。

问:附件上传成功了,但点开是空白或者下载下来打不开?
文件写进去了但内容不完整,通常是写入过程中被超时中断,或者共享存储不稳定。对比一下服务器上文件的实际大小和原文件大小,差得多就是传输被截断了,回去把超时参数调大。

泛微这套东西现场差异比较大,不同版本和部署方式细节不完全一样。你要是排到某一步卡住了,把日志里的报错贴到 fenij.com 的评论区,我帮你看看是哪一层的问题。