使用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
相关产品推荐
相关产品推荐

