通过REST API上传Workflow生成的.exe文件时损坏,体积增大
问题定位与修复方案
问题根源
Github Action环境里的PowerShell默认会以文本模式处理文件,而非二进制模式。当你的Get-MultipartBody函数读取exe文件构造请求体时,PowerShell会把二进制字节当成文本解析(比如自动转成UTF-8编码),导致字节串被篡改,最终上传的文件体积变大且损坏。
本地环境因为PowerShell配置或脚本处理逻辑的差异,默认用了二进制模式读取文件,所以没问题;而actions/upload-artifact@v4是专门处理二进制文件的官方动作,不会触发编码转换,因此文件正常。
具体修复步骤
针对你的PowerShell脚本,核心是强制以二进制方式读取和处理exe文件:
替换文件读取方式
别用Get-Content读取exe文件,改用.NET的二进制读取方法直接获取字节数组,彻底避免编码转换:# 原错误写法(文本模式读取) # $fileContent = Get-Content $filePath -Raw # 替换为二进制读取 $fileBytes = [System.IO.File]::ReadAllBytes($filePath)构造多部分请求体时保留二进制原样
拼接multipart请求体时,直接操作字节数组,不要转成字符串后再处理:$boundary = "----WebKitFormBoundary$([Guid]::NewGuid())" # 构造请求头部字节 $header = "--$boundary`r`nContent-Disposition: form-data; name=`"file`"; filename=`"$fileName`"`r`nContent-Type: application/octet-stream`r`n`r`n" $headerBytes = [System.Text.Encoding]::UTF8.GetBytes($header) # 构造请求尾部字节 $footerBytes = [System.Text.Encoding]::UTF8.GetBytes("`r`n--$boundary--`r`n") # 拼接所有部分:头部 + 文件二进制字节 + 尾部 $multipartBody = $headerBytes + $fileBytes + $footerBytes调用Invoke-WebRequest时传入字节数组
确保请求的Body是字节数组,同时指定正确的Content-Type:Invoke-WebRequest -Uri $apiUrl -Method Post ` -ContentType "multipart/form-data; boundary=$boundary" ` -Body $multipartBody
验证方法
- 本地运行修改后的脚本,确认上传文件正常
- 在Github Action中触发工作流,对比本地文件和服务器文件的哈希值(比如用
Get-FileHash),验证完整性
内容的提问来源于stack exchange,提问作者Javier Castro
相关产品推荐
相关产品推荐

