docs: 更新需求文档至v0.5并归档开发进度;修复大文件上传与二维码海报
- 需求文档升级到 v0.5:补充二维码海报保存文件名默认格式、大文件上传三层限制(IIS+ASP.NET+前端)部署约束、新增第11章开发进度状态归档(已上线功能/已修复缺陷/已知限制/后续优化) - 后端 FileController.Upload 增加 [RequestFormLimits(MultipartBodyLengthLimit=220_200_960)],修复>128MB multipart 上传被拒 - 前端 UploadView 二维码海报:修正 drawImage 缩放错位、顶部logo/标题垂直居中、分区标题间距、大小与有效期分行显示;保存文件名改为 文传易取件码-取件码(原文件名)-流水号.png - 新增部署脚本:apply_backend.ps1 / force_dll.ps1(app_offline 解锁DLL)/ ftp_fe.ps1 / ftp_diag.ps1 / ftp_apply.ps1 / _diag/check_dll.ps1 (部署手册 IIS部署与FTP发布.md 仅含编码/BOM 差异,未纳入本次提交)
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
# Apply: new appsettings.json (localhost) + restore web.config (stdout off, triggers restart) + nested assets
|
||||
$ErrorActionPreference = "Continue"
|
||||
$FtpHost="116.198.221.125"; $FtpPort=21; $FtpUser="wenchuanyi"; $FtpPass="r7P^f*v7rFts"
|
||||
$Local = "D:\CodeBuddy\Pros\WenChuanyi\backend\WenChuanyi.Api\bin\Release\net8.0\publish"
|
||||
$Dist = "D:\CodeBuddy\Pros\WenChuanyi\frontend\dist"
|
||||
function NewR($p,$m,$to=90000){ $u="ftp://${FtpHost}:${FtpPort}/"+$p.TrimStart('/'); $r=[System.Net.FtpWebRequest]::Create($u); $r.Method=$m; $r.Credentials=New-Object System.Net.NetworkCredential($FtpUser,$FtpPass); $r.UsePassive=$true; $r.UseBinary=$true; $r.KeepAlive=$false; $r.Timeout=$to; $r }
|
||||
function Mk($p){
|
||||
try{ $r=NewR $p ([System.Net.WebRequestMethods+Ftp]::MakeDirectory); $resp=$r.GetResponse(); try{$resp.Close()}catch{} }catch{}
|
||||
Start-Sleep -Milliseconds 300
|
||||
}
|
||||
function GetSizeF($p){
|
||||
try{ $r=NewR $p ([System.Net.WebRequestMethods+Ftp]::GetFileSize) 30000; $resp=$r.GetResponse(); $s=$resp.ContentLength; $resp.Close(); return $s }
|
||||
catch{ return -1 }
|
||||
}
|
||||
function UpF($lp,$rp){
|
||||
$want=(Get-Item $lp).Length
|
||||
for($i=1;$i -le 4;$i++){
|
||||
try{
|
||||
$r=NewR $rp ([System.Net.WebRequestMethods+Ftp]::UploadFile) 300000
|
||||
$b=[IO.File]::ReadAllBytes($lp); $r.ContentLength=$b.Length
|
||||
$s=$r.GetRequestStream(); try{ $s.Write($b,0,$b.Length) } finally { $s.Close() }
|
||||
$resp=$r.GetResponse(); try{ $resp.Close() }catch{}
|
||||
Start-Sleep -Milliseconds 300
|
||||
$after=GetSizeF $rp
|
||||
if($after -eq $want){ Write-Host "UP OK $rp"; return $true }
|
||||
Write-Host "SIZE MISMATCH $rp got=$after want=$want"
|
||||
}catch{ Write-Host "RETRY($i) $rp : $($_.Exception.Message)" }
|
||||
Start-Sleep -Seconds 3
|
||||
}
|
||||
Write-Host "FAIL $rp"; return $false
|
||||
}
|
||||
# 1. appsettings.json (localhost db)
|
||||
UpF "$Local\appsettings.json" "/wwwroot/appsettings.json"
|
||||
# 2. web.config: stdout off (production) - also triggers app pool restart
|
||||
$wc = @"
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<location path="." inheritInChildApplications="false">
|
||||
<system.webServer>
|
||||
<handlers>
|
||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||
</handlers>
|
||||
<aspNetCore processPath="dotnet" arguments=".\WenChuanyi.Api.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
|
||||
</system.webServer>
|
||||
</location>
|
||||
</configuration>
|
||||
"@
|
||||
$tmp = Join-Path $env:TEMP "wcy_web_prod.config"
|
||||
[IO.File]::WriteAllText($tmp, $wc, [Text.Encoding]::UTF8)
|
||||
UpF $tmp "/wwwroot/web.config"
|
||||
# 3. nested wwwroot assets (frontend static files served by ASP.NET Core WebRoot)
|
||||
Mk "/wwwroot/wwwroot/assets"
|
||||
UpF "$Dist\assets\index-Bwz67ZeI.js" "/wwwroot/wwwroot/assets/index-Bwz67ZeI.js"
|
||||
UpF "$Dist\assets\index-c9wa7v4K.css" "/wwwroot/wwwroot/assets/index-c9wa7v4K.css"
|
||||
Write-Host "APPLY DONE"
|
||||
Reference in New Issue
Block a user