当前位置: 首页 > 知识库问答 >
问题:

过帐多部分表单数据问题

梁丘安晏
2023-03-14

我正在使用HttpWebRequest发布到MMS API。文章正文包含有关传递和彩信的XML数据,作为需要Base64编码的MIME多部分附件。

帖子是成功的,但我只收到文字,而不是图像。

查看我的代码时,它似乎构建了表单数据,但当我将其转换回字符串时,文件数据丢失了。

str变量的内容:

------------f2de17263b724d5a919b14a6834c489f内容配置:表单数据;name="username"

三部曲 ------------f2de17263b724d5a919b14a6834c489f内容配置:表单数据;name="密码"

ZBo8KE6m ------------f2de17263b724d5a919b14a6834c489f内容配置:表单数据;name="数字"

6140270898------f2de17263b724d5a919b14a6834c489f内容处理:表单数据;name=“主题”

测试消息主题

------------f2de17263b724d5a919b14a6834c489f内容配置:表单数据;名称="消息"

测试消息体。

------------f2de17263b724d5a919b14a6834c489f内容处理:表单数据;name=“type0”

Image/jpeg ------------f2de17263b724d5a919b14a6834c489f内容配置:表单数据;name="type1"

image/jpeg------f2de17263b724d5a919b14a6834c489f内容配置:表单数据;name=“name0”

代金券png------f2de17263b724d5a919b14a6834c489f内容配置:表单数据;name=“name1”

QRCode。png------f2de17263b724d5a919b14a6834c489f内容配置:表单数据;name=“attachment0”;filename=“凭证.png”内容类型:图像/jpeg

PNG

    private static readonly Encoding encoding = Encoding.UTF8;
    public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, Dictionary<string, object> postParameters)
    {
        string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());
        string contentType = "multipart/form-data; boundary=" + formDataBoundary;

        byte[] formData = GetMultipartFormData(postParameters, formDataBoundary);
        var str = Encoding.UTF8.GetString(formData);

        return PostForm(postUrl, userAgent, contentType, formData);
    }

    private static byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)
    {
        Stream formDataStream = new System.IO.MemoryStream();
        byte[] formData = new byte[0];
        bool needsCLRF = false;
        try
        {
            foreach (var param in postParameters)
            {
                // add a CRLF to allow multiple parameters to be added (skip it on the 1st parameter)
                if (needsCLRF)
                    formDataStream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n"));

                needsCLRF = true;

                if (param.Value is FileParameter)
                {
                    FileParameter fileToUpload = (FileParameter)param.Value;

                    // add just the first part of this param, since we will write the file data directly to the stream
                    string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n",
                        boundary,
                        param.Key,
                        fileToUpload.FileName ?? param.Key,
                        fileToUpload.ContentType ?? "application/octet-stream");

                    formDataStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header));

                    // write the file to the stream
                    string str = Convert.ToBase64String(fileToUpload.File);
                    byte[] myBytes = Convert.FromBase64String(str);
                    formDataStream.Write(myBytes, 0, myBytes.Length);
                                        }
                else
                {
                    string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",
                        boundary,
                        param.Key,
                        param.Value);
                    formDataStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData));
                }
            }

            // add the end of the request. Start with a newline
            string footer = "\r\n--" + boundary + "--\r\n";
            formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer));

            // dump stream into byte array
            formDataStream.Position = 0;
            formData = new byte[formDataStream.Length];
            formDataStream.Read(formData, 0, formData.Length);
            formDataStream.Close();
        }
        catch (Exception ex)
        {
            gFunc.ProcessError(true, ex.ToString(), "Post Data");
        }
        return formData;
    }

共有1个答案

陆星文
2023-03-14

原来问题出在post数据上。

删除文件参数的“内容分发”中的其他字段后,它开始工作。

上一个:内容配置:表单数据;名称="attachment0";文件名="Voucher.png"内容类型:图像/jpeg

现在:内容配置:表单数据;name=“附件0”

 类似资料:
  • 我正在创建一个扩展,该扩展通过使用Codenvy提供的REST API来实现过程的自动化。然而,我遇到了多部分/表单数据POST请求的麻烦。具体地说,就是创建一个新工厂。 这是我的Ajax/jQuery调用: 但我得到一个409错误的消息: 在多部分/表单-数据的“工厂URL”部分中找不到工厂URL信息 我已经在Codenvy论坛上发了帖子,但我得到的唯一有用的东西是一个curl命令

  • 问题内容: 我一直在使用与杰克逊结合使用Apache CXF来消费和产生JSON文件的Web服务。 但是,服务的一种方法应该能够保存从移动应用程序上传的图像,该图像向我的Web服务发出多部分/表单数据POST请求,而且我不知道如何在我的内部处理这种内容类型上下文。我们通常创建“ Request”和“ Response”对象来使用和产生JSON,但是,在这种情况下,这恐怕不起作用。 这是请求格式:

  • 通常,我需要通过JSOUP将数据以响应multipart/form-data的形式发送到站点 作为一个示例,使用一个简单的窗体来sgeniriruet您的查询。 <表单操作=«localhost:8000»方法=«post»enctype=»多部分/表单数据» <输入类型=»文本»名称=»文本»值=»文本默认值» <输入类型=»文件»名称=»文件1» <输入类型=»文件»名称=»文件2» 提交 通

  • 我目前正在尝试解析我通过Chrome中的Postman插件发送的。然而,我得到的输出如下: 当我尝试调试时,会得到这个输出。当我尝试时,我得到一个空数组,所以我假设数据的格式不正确(只是一个字符串)。在我写我自己的算法之前,我想确定我没有用这个算法重新发明轮子。我做错什么了?或者,如果没有,是否存在一些CakePHP3函数来处理这个问题? 更新 我发现了代码中的错误,路由过程似乎以某种方式将pos

  • 这是在服务器端作为接收的内容: 如何转换multipart Confont数据类型中的文章对象?我读到改造可能允许使用转换器为这个。就我对文档的理解而言,它应该是实现的东西。 多部分部件使用的转换器,或者它们可以实现来处理自己的序列化。 null

  • 我必须以这种格式发送一个post请求。 我基本上尝试在post请求中发送一张名为的照片,如下图所示: 以下是我所考虑的解决方案的片段: https://github.com/square/reverfit/issues/1140 https://futurestud.io/blog/reverfit-2-how-to-upload-files-to-server 改装-多部分请求:所需的Multi