Dynamics 365 CRM文件上传异常:原test.pdf文件显示为untitled.txt
Dynamics 365 CRM文件上传异常:原test.pdf文件显示为untitled.txt
嘿,我仔细扒了你的上传代码,发现问题出在两个核心点上——请求方法选错了,以及没匹配上Dynamics 365 Web API对文件上传的特殊要求,下面给你一步步理清楚:
问题根源
- 错误使用
PatchAsync请求:Dynamics 365的文件类型字段(不管是自定义文件列还是笔记的附件),都需要用PUT请求来完成内容上传。PATCH是用来更新实体的普通字段的,根本不适合处理媒体内容替换,这直接导致系统没读取到你设置的文件名,默认生成了untitled.txt。 - Content-Disposition头的作用被忽略:虽然你设置了文件名,但因为请求方法不对,这个头的信息根本没被系统正确解析。
修正后的代码
我把关键部分调整好了,你直接替换测试就行:
public async Task<bool> UploadFile(string entityName, string recordId, string columnName, string base64String) { string baseUrl = $@"{serviceUrl}{entityName}({recordId})/{columnName}"; using (var client = crmConfig.BuildClient()) { client.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0"); client.DefaultRequestHeaders.Add("OData-Version", "4.0"); string fileName = "test.pdf"; // 建议用对应文件的精准MIME类型,pdf用application/pdf比通用的octet-stream更稳妥 string contentType = "application/pdf"; byte[] fileBytes = Convert.FromBase64String(base64String); ByteArrayContent fileContent = new ByteArrayContent(fileBytes); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName, }; fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType); // 最关键的修改:把PatchAsync换成PutAsync HttpResponseMessage response = await client.PutAsync(baseUrl, fileContent); if (response.IsSuccessStatusCode) { Console.WriteLine("File uploaded successfully."); return true; } else { Console.WriteLine("Error uploading the file. Status code: " + response.StatusCode); return false; } } }
额外提醒
- 要确认
columnName是Dynamics 365里文件字段的逻辑名称,不是显示名称。比如你界面上叫“合同附件”,逻辑名称可能是new_contractattachment。 - 上传其他类型文件时,记得同步改
contentType为对应MIME类型(比如docx用application/vnd.openxmlformats-officedocument.wordprocessingml.document),这样CRM也能正确识别文件类型。
备注:内容来源于stack exchange,提问作者han na
相关产品推荐
相关产品推荐

