调用ServiceNow Attachment API上传文件成功但文件损坏求助
ServiceNow附件API上传文件损坏问题排查与解决
问题原因
文件损坏源于请求格式错误:
- 使用RestSharp的
AddFileBytes方法时,框架会自动构建multipart/form-data类型请求,包含正确的boundary分隔符与表单字段信息。 - 你手动添加的
Content-Type请求头覆盖了RestSharp自动生成的正确头信息,导致ServiceNow无法正确解析请求体,最终把包含boundary、表单描述的整个请求内容当成文件本身保存,所以文件中出现多余的分隔符与字段描述内容。
解决方案
- 移除手动设置的请求头:删除代码中
request.AddHeader("Content-Type", content_type);这一行,让RestSharp自动处理请求的Content-Type。 - 正确传递文件MIME类型(可选):如果需要指定文件的Content-Type,直接在
AddFileBytes方法的参数中传递,而非设置请求头。
修正后的代码
private static bool UploadFileBytes(byte[] file_bytes, string file_name, string table_name, string table_sys_id, string content_type) { bool retval = false; try { string URL = SN_Srv_dest + $"/api/now/attachment/file?table_name={table_name}&table_sys_id={table_sys_id}&file_name={file_name}"; Console.WriteLine("Post file to SN: " + URL); var client = new RestClient(URL); var request = new RestRequest(Method.POST); // 将文件的Content-Type作为AddFileBytes的第四个参数传递 request.AddFileBytes("file", file_bytes, file_name, content_type); client.Authenticator = new HttpBasicAuthenticator(SN_Id_dest, SN_Pw_dest); IRestResponse response = client.Execute(request); if (response.IsSuccessful) { Console.WriteLine($"Post file {file_name} success: {response.Content}"); retval = true; } else { Console.WriteLine($"Post file {file_name} failed: {response.Content}"); retval = false; } } catch(Exception e) { Console.WriteLine($"Post file {file_name} failed: {e.Message}"); } return retval; }
验证说明
修正后,RestSharp会自动生成符合规范的multipart/form-data请求,ServiceNow能正确解析出文件内容,上传的纯文本文件内容会恢复为正常的test,不再包含boundary等多余信息。
内容的提问来源于stack exchange,提问作者bruce neiman
相关产品推荐
相关产品推荐

