M-code 2023-11-18 17:42 采纳率: 40%
浏览 8

C#使用MultipartFormDataContent请求微信上传备案媒体材料接口响应41005,media data missing。应该怎么处理?

C#使用MultipartFormDataContent请求微信上传备案媒体材料接口响应41005,media data missing。应该怎么处理?
微信的接口文档:https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/record/uploadIcpMedia.html
代码如下:

//上传备案媒体材料
private string uploadIcpMedia(HttpContext context)
        {
            string accessToken = context.Request.QueryString["access_token"];
            string type = context.Request.Form["type"];
            string certificateType = context.Request.Form["certificate_type"];
            string icpOrderField = context.Request.Form["icp_order_field"];
            HttpPostedFile file = context.Request.Files["media"];
            byte[] mediaByte= null;
            if (type== "video")
            {
                mediaByte = GetMediaBytes(file);
            }
            if (!string.IsNullOrEmpty(accessToken) && !string.IsNullOrEmpty(type) && !string.IsNullOrEmpty(icpOrderField))
            {

                if (file != null)
                {
                    string apiUrl = $"https://api.weixin.qq.com/wxa/icp/upload_icp_media?access_token={accessToken}";

                    var httpClient = new HttpClient();
                    string boundary = Guid.NewGuid().ToString("N");
                    var content = new MultipartFormDataContent(boundary);
                    content.Headers.ContentType = MediaTypeHeaderValue.Parse($"multipart/form-data;boundary=\"{boundary}\"");
                    content.Add(new StringContent(type), "type");
                    content.Add(new StringContent(certificateType), "certificate_type");
                    content.Add(new StringContent(icpOrderField), "icp_order_field");
                    file.InputStream.Seek(0, SeekOrigin.Begin);
                    if (type == "video")
                    {
                        content.Add(new ByteArrayContent(mediaByte), "media", $"\"{file.FileName}\"");
                    }
                    else
                    {
                        content.Add(new StreamContent(file.InputStream), "media", $"\"{file.FileName}\"");
                    }
                    
                    string requestString = content.ReadAsStringAsync().Result;
                    var postResult = httpClient.PostAsync(apiUrl, content).Result;
                    string result = postResult.Content.ReadAsStringAsync().Result;

                    return result;
                }
                else
                {
                    return "No media data provided";
                }
            }
            else
            {
                return "Missing required parameters: access_token, type, and/or icp_order_field";
            }
        }

我觉得应该是content的内容有问题,但是不知道怎么正确处理。
这是在visual studio中调试content的内容,因为输出的是字符串,所以文件的data乱码没有显示

--9ca34941f422418ca91d5e34adc98572
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=type

image
--9ca34941f422418ca91d5e34adc98572
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=certificate_type

5
--9ca34941f422418ca91d5e34adc98572
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=icp_order_field

icp_subject.principal_info.certificate_photo_front
--9ca34941f422418ca91d5e34adc98572
Content-Disposition: form-data; name=media; filename="bg.png"; filename*=utf-8''%22bg.png%22

�PNG

下面是使用上传临时素材成功的代码,两个方法都是用的相同方法,但是不知道为什么,上传备案材料的接口就不行。可能是form-data的参数比较多吧。上传备案的方法的boundary得加双引号,但是我看到有个人说得去掉双引号才能成功,所以下面上传素材的方法就成功了。如果上传备案的方法去掉双引号,反而会报缺失参数。真的不知道怎么处理了。
上传临时素材文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Mini_Program_Basic_Info/setnickname.html

//上传临时素材
 private string uploadMedia(HttpContext context)
        {
            string accessToken = context.Request.QueryString["access_token"];
            string type = context.Request.QueryString["type"];
            HttpPostedFile file = context.Request.Files["media"];

            if (file != null && file.ContentLength > 0)
            {
                string apiurl = $"https://api.weixin.qq.com/cgi-bin/media/upload?access_token={accessToken}&type={type}";
                var httpClient = new HttpClient();
                string boundary = Guid.NewGuid().ToString("N");
                var content = new MultipartFormDataContent(boundary);
                content.Headers.ContentType = MediaTypeHeaderValue.Parse($"multipart/form-data;boundary={boundary}");
                file.InputStream.Seek(0, SeekOrigin.Begin);
                content.Add(new StreamContent(file.InputStream), "media", $"\"{file.FileName}\"");
                string requestString = content.ReadAsStringAsync().Result;
                var postResult = httpClient.PostAsync(apiurl, content).Result;
                string result = postResult.Content.ReadAsStringAsync().Result;

                return result;
            }
            else
            {
                return "No file uploaded";
            }
        }
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-19 05:03
    关注

    【以下回答由 GPT 生成】

    当使用C#中的MultipartFormDataContent请求微信上传备案媒体材料接口时遇到问题,可能是因为数据没有正确添加到MultipartFormDataContent对象中。以下是一些可能的解决方案:

    1. 确保已将MultipartFormDataContent对象实例化: csharp using (var content = new MultipartFormDataContent()) { // 在这里添加数据 }

    2. 确保没有遗漏任何媒体数据。使用Add方法向MultipartFormDataContent对象添加数据。例如,如果要添加一个文本字段,可以使用StringContent,并指定Content-Disposition标头: csharp content.Add(new StringContent("field value"), "field name");

    3. 如果要上传文件,可以使用ByteArrayContent或StreamContent,并指定Content-Disposition标头: csharp var fileContent = new ByteArrayContent(fileBytes); // fileBytes是文件的字节数组 fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file field name", FileName = "file name" }; content.Add(fileContent);

    4. 确保使用正确的接口地址、请求方法和身份验证。

    如果上述解决方案没有解决您的问题,请提供更多详细信息,例如您遇到的具体错误消息、代码示例以及微信接口文档中的要求,以便更准确地帮助您解决问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月18日

悬赏问题

  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused