PowerShell调用Rest API上传PDF转Base64遇问题求助
我来帮你排查这个问题,你遇到的这些错误本质上都是上传的PDF文件数据不完整或编码格式错误导致的,咱们一步步来定位解决:
第一步:确认Base64编码的正确性
你提到的"The input is not a valid Base-64 string"是关键信号,说明编码过程大概率出了问题。PowerShell里处理二进制PDF文件的正确姿势是直接读取字节流再转Base64,千万别用文本方式读取:# 正确读取PDF并转为标准Base64字符串 $filePath = "C:\your\local\path\file.pdf" $fileBytes = [System.IO.File]::ReadAllBytes($filePath) $base64String = [Convert]::ToBase64String($fileBytes)另外,有些API要求Base64字符串不能有换行或空格,你可以用
$base64String = $base64String -replace "\s+", ""清理掉多余的空白字符。第二步:检查REST API请求的格式匹配度
不同API对文件上传的格式要求不一样,选错格式直接会导致服务器解析失败:- 如果API要求JSON传参,要确保Base64字符串正确放入指定字段,比如:
$requestBody = @{ documentData = $base64String fileName = "uploaded_file.pdf" } | ConvertTo-Json -Compress Invoke-RestMethod -Uri "https://your-api-url/upload" -Method Post -Body $requestBody -ContentType "application/json" - 如果支持
multipart/form-data格式,直接上传字节流会更可靠(无需转Base64):Invoke-RestMethod -Uri "https://your-api-url/upload" -Method Post -Form @{ file = Get-Item $filePath }
一定要对照API文档确认要求的上传方式,这是最容易踩坑的点。
- 如果API要求JSON传参,要确保Base64字符串正确放入指定字段,比如:
第三步:验证上传文件的完整性
上传成功后,把服务器上的文件下载回来,和本地原文件对比哈希值,确认数据有没有丢失:# 计算本地原文件的SHA256哈希 $localHash = (Get-FileHash $filePath -Algorithm SHA256).Hash # 从服务器下载文件 $downloadedPath = "C:\temp\downloaded_test.pdf" Invoke-RestMethod -Uri "https://your-api-url/download/your-file-id" -Method Get -OutFile $downloadedPath # 计算下载文件的哈希 $serverHash = (Get-FileHash $downloadedPath -Algorithm SHA256).Hash # 对比哈希值 if ($localHash -eq $serverHash) { Write-Host "文件上传完整,数据无丢失" } else { Write-Host "文件在上传过程中损坏,请检查请求构造" }如果哈希不一致,说明上传时数据被截断或篡改,重点排查请求头的
Content-Length是否正确,或者API有没有文件大小限制。第四步:排除服务器端的问题
如果以上操作都没问题,那可能是服务器端的解码或存储逻辑有问题。你可以用Postman手动上传同一个PDF文件,如果Postman能正常打开,说明PowerShell的请求和Postman的请求有差异——对比两者的请求头、请求体内容,找出不同点(比如是否少了某个必要的Header,或者JSON字段名拼写错误)。
内容的提问来源于stack exchange,提问作者Lilith Mae

