You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过REST API上传Workflow生成的.exe文件时损坏,体积增大

问题定位与修复方案

问题根源

Github Action环境里的PowerShell默认会以文本模式处理文件,而非二进制模式。当你的Get-MultipartBody函数读取exe文件构造请求体时,PowerShell会把二进制字节当成文本解析(比如自动转成UTF-8编码),导致字节串被篡改,最终上传的文件体积变大且损坏。

本地环境因为PowerShell配置或脚本处理逻辑的差异,默认用了二进制模式读取文件,所以没问题;而actions/upload-artifact@v4是专门处理二进制文件的官方动作,不会触发编码转换,因此文件正常。

具体修复步骤

针对你的PowerShell脚本,核心是强制以二进制方式读取和处理exe文件:

  1. 替换文件读取方式
    别用Get-Content读取exe文件,改用.NET的二进制读取方法直接获取字节数组,彻底避免编码转换:

    # 原错误写法(文本模式读取)
    # $fileContent = Get-Content $filePath -Raw
    # 替换为二进制读取
    $fileBytes = [System.IO.File]::ReadAllBytes($filePath)
    
  2. 构造多部分请求体时保留二进制原样
    拼接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
    
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:27:23