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

使用PowerShell+REST API上传PNG至TFS后显示异常,求排查原因

TFS REST API上传PNG图片显示异常问题排查

问题场景

我使用以下PowerShell脚本结合TFS REST API上传PNG附件:

class TfsHelper{
#...
  [string]UploadPng([string]$TfsProject, [string]$PngFileName) {
    $uri = "http://$organization/$TfsProject/_apis/wit/attachments?fileName=image.png&api-version=5.1"
    $strPngBase64 = [convert]::ToBase64String((Get-Content $PngFileName -Encoding byte))  
    $rtn = Invoke-RestMethod -Uri $uri -Method POST -Headers $this.Header `
      -Body $strPngBase64 `
      -ContentType 'application/octet-stream'
    return $rtn.url
  }
}

UploadPng函数执行成功,能获取包含PNG链接和UUID的响应,但在浏览器打开该链接时,上传的图片显示为乱码破损状态,和本地正常的PNG原图完全不符。

问题原因

代码中将图片转成Base64字符串后直接作为请求体发送,但Invoke-RestMethod处理字符串类型的Body时,会默认按UTF-8编码把字符串转换为字节流发送。TFS服务器收到的是Base64字符串的UTF-8字节,而非图片原始字节的Base64解码结果,最终导致图片损坏无法正常显示。

修复代码

直接传递图片的原始字节数组作为请求体即可,无需Base64转换步骤:

class TfsHelper{
#...
  [string]UploadPng([string]$TfsProject, [string]$PngFileName) {
    $uri = "http://$organization/$TfsProject/_apis/wit/attachments?fileName=image.png&api-version=5.1"
    # 直接读取图片原始字节数组
    $imageRawBytes = Get-Content $PngFileName -Encoding byte
    $rtn = Invoke-RestMethod -Uri $uri -Method POST -Headers $this.Header `
      -Body $imageRawBytes `
      -ContentType 'application/octet-stream'
    return $rtn.url
  }
}

特殊场景补充

如果因特殊需求必须使用Base64传递,需将Base64字符串转回ASCII编码的字节数组再发送:

$strPngBase64 = [convert]::ToBase64String((Get-Content $PngFileName -Encoding byte))
# 将Base64字符串转为ASCII字节数组
$bodyBytes = [System.Text.Encoding]::ASCII.GetBytes($strPngBase64)

之后将$bodyBytes作为请求Body传递即可,但这种做法冗余,直接传递原始字节是最优解。

内容的提问来源于stack exchange,提问作者zhong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:46:14