Commit 53b23899 authored by wenwen.tang's avatar wenwen.tang 😕

fix(contracts): 单份上限 20MB -> 40MB(1101/1115 室那份合同 21.8MB 被拒)

批量导入「项目合约」时发现最大的一份扫描件 21.8MB,被 20MB 上限挡下
(29 份里其余 ≤ 12.7MB)。上限设 40MB:既覆盖扫描件,base64 后 53MB
仍小于 server 的 MAX_BODY=64MB,不会在 HTTP 层被拒。
同步前端 pickContract 的预检与两处文案;补一条守护测试(上限 ≥ 22MB 且
base64 后 < 64MB),避免以后又把上限调小回去。
parent 9b731ea8
......@@ -11,7 +11,8 @@
设计要点:
- id = uuid4().hex(32 位十六进制),进 URL 安全,且不可枚举
- 允许 PDF / Word / Excel / 常见图片,单份 ≤ 20MB(合同多有扫描件,比图片宽松)
- 允许 PDF / Word / Excel / 常见图片,单份 ≤ 40MB(合同扫描件常 20MB+,比图片宽松;
base64 后仍小于 server 的 MAX_BODY=64MB)
- 前端把 FileReader 读出的 data URL 整串 POST 过来,这里负责剥前缀
- 查看接口支持 ?token= 查询参数鉴权,这样 <a href> / <iframe> 能直接引用
- 台账里只存「[{id, name}]」这种轻量关联;文件本体独立存放、独立删除
......@@ -28,7 +29,7 @@ import uuid
from . import config as C
MAX_BYTES = 20 * 1024 * 1024 # 单份 20MB(解码后的原始字节)
MAX_BYTES = 40 * 1024 * 1024 # 单份 40MB(解码后的原始字节)
# MIME → 落盘扩展名
_MIME_EXT = {
......
......@@ -93,6 +93,12 @@ class TestDecode(Base):
with self.assertRaises(ValueError):
CT._decode(b64(PDF), "302.pdf")
def test_limit_covers_largest_contract(self):
"""上限要收得下「项目合约」里最大的那份(21.8MB),
且 base64 后仍小于 server 的 MAX_BODY=64MB,否则上传会在 HTTP 层被拒。"""
self.assertGreaterEqual(CT.MAX_BYTES, 22 * 1024 * 1024)
self.assertLess(CT.MAX_BYTES * 4 // 3, 64 * 1024 * 1024)
class TestStore(Base):
def test_save_find_path_list_remove(self):
......
......@@ -342,7 +342,7 @@
数值/金额列按类型校验,「合计」行为当前显示行的实时汇总。每次提交都会记入下方「修改记录」,可撤销。
<br>最右边的<b>「合同原件」</b>列用来挂本单元的合同(存服务器),点格子里的按钮可以<b>查阅 / 下载</b>合同;
编辑模式下同一个浮层里能<b>上传</b>或<b>移除</b>(一份可挂多份:租赁合同 + 补充协议 + 车位合同)。
支持 PDF / Word / Excel / 图片,单个 ≤ 20MB;「移除」只解除本行关联,不会删掉服务器上的文件。
支持 PDF / Word / Excel / 图片,单个 ≤ 40MB;「移除」只解除本行关联,不会删掉服务器上的文件。
<br>数据仅初次导入有效,之后不提供导入;增删改一律在页面完成。
</div>
</div>
......
......@@ -3809,7 +3809,7 @@ async function renderFilesDlg(rowId) {
$('#modalBody').innerHTML = `${body}
<div class="spacer"></div>
<div class="muted" style="font-size:12px">
支持 PDF / Word / Excel / 图片,单个文件不超过 20MB。
支持 PDF / Word / Excel / 图片,单个文件不超过 40MB。
${canWrite
? '从本行移除只解除关联,不会删掉服务器上的文件(别的行若也挂了同一份,照常可查阅)。' +
'改动会先<b>暂存</b>,回列表点「保存 N 处改动」才写入台账。'
......@@ -3839,7 +3839,7 @@ async function pickContract(rowId) {
const cur = filesValueOf(rowId).slice();
let added = 0;
for (const f of files) {
if (f.size > 20 * 1024 * 1024) { toast(`「${f.name}」超过 20MB,已跳过`, 'err'); continue; }
if (f.size > 40 * 1024 * 1024) { toast(`「${f.name}」超过 40MB,已跳过`, 'err'); continue; }
try {
const dataUrl = await readAsDataURL(f);
const d = await api('/api/contracts', {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment