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

如何用PowerShell通过ServiceNow REST API上传CSV/XLSX至事件?遇415错误

解决ServiceNow附件上传API的415 Unsupported Media Type错误

这个415错误的根源在于你调用ServiceNow附件上传API的方式不对——/api/now/attachment/upload接口要求用multipart/form-data格式提交请求,而不是你当前用的JSON格式,同时也不能直接传文件路径,得把文件内容作为表单数据的一部分上传。

核心问题分析

  • 你之前手动设置了Content-Type: text/csv,还把请求体转成了JSON,这完全不符合接口的要求
  • ServiceNow的附件上传接口需要通过表单字段传递三个关键信息:table_name(表名)、table_sys_id(记录的sys_id)、uploadFile(文件的字节内容),同时可以指定file_name来设置附件在系统中显示的名称

修正后的完整脚本

# 检查并获取ServiceNow凭据
if (!$script:ServiceNowCreds) { 
    $script:ServiceNowCreds = Get-Credential 
}

# 1. 获取目标事件的sys_id
$snow_url = 'https://dev652xx.service-now.com/api/now/table/incident'
$Body = @{ 'number' = 'INC00xx059' }
$result = Invoke-RestMethod -Uri $snow_url -Credential $script:ServiceNowCreds -Body $Body -ContentType "application/json"

# 2. 遍历查询结果(按事件编号查询通常只会返回一条记录)
$result.result | Select-Object sys_id, number | ForEach-Object {
    $sys_id = $_.sys_id
    $incident_number = $_.number
    Write-Host "准备上传附件到事件: $incident_number (sys_id: $sys_id)"

    $Upload_snow_url = 'https://dev652xx.servicenow.com/api/now/attachment/upload'
    
    # 读取要上传的文件原始字节内容
    $filePath = 'C:\Users\suganthanraj.p\Documents\Servers.csv'
    $fileContent = Get-Content -Path $filePath -Raw -Encoding Byte

    # 构建multipart/form-data表单参数
    $formParams = @{
        table_name     = 'incident'
        table_sys_id   = $sys_id
        file_name      = [System.IO.Path]::GetFileName($filePath) # 提取纯文件名,避免传递本地路径
        uploadFile     = $fileContent
    }

    # 调用上传接口,使用-Form参数自动处理multipart格式
    try {
        $UploadResult = Invoke-RestMethod -Uri $Upload_snow_url -Credential $script:ServiceNowCreds -Method Post -Form $formParams
        Write-Host "附件上传成功!返回结果:"
        $UploadResult
    }
    catch {
        Write-Error "上传失败:$_"
    }
}

关键改动说明

  • 移除了手动设置的Content-Type和Accept头:Invoke-RestMethod使用-Form参数时会自动添加正确的multipart/form-data头,无需手动指定
  • 用Get-Content -Raw -Encoding Byte读取文件的原始字节内容,作为uploadFile字段的值传递给接口,这是ServiceNow识别附件内容的正确方式
  • 使用-Form参数替代-Body,让PowerShell自动处理multipart表单的编码逻辑,避免手动拼接格式出错
  • 用[System.IO.Path]::GetFileName($filePath)提取纯文件名,避免把本地文件路径传递给ServiceNow,保证跨环境兼容性

这样修改后,就能完全符合ServiceNow API的要求,解决415错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:20:17