c# 模拟表单提交,post form 上传文件、大数据内容

时间:2021-12-20 23:25:33

表单提交协议规定:
要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,,而且要设定一个 boundary 参数,
这个参数是由应用程序自行产生,它会用来识别每一份资料的边界 (boundary),
用以产生多重信息部份 (message part)。
而 HTTP 服务器可以抓取 HTTP POST 的信息,


基本内容:
1. 每个信息部份都要用 --[BOUNDARY_NAME] 来包装,以分隔出信息的每个部份,而最后要再加上一个 --[BOUNDARY_NAME] 来表示结束。
2. 每个信息部份都要有一个 Content-Disposition: form-data;,而 name 设定的就是 HTTP POST 的键值 (key)。
3. 声明区和值区中间要隔两个新行符号(\r\n)。
4. 中间可以夹入二进制资料,但二进制资料必须要格式化为二进制字符串。
5. 若要设定不同信息段的资料型别 (Content-Type),则要在信息段内的声明区设定。


两个form内容模板
boundary = "----" + DateTime.Now.Ticks.ToString("x");//程序生成
1.文本内容
"\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"键\"; filename=\"文件名\"" +
"\r\nContent-Type: application/octet-stream" +
"\r\n\r\n";
2.文件内容
"\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"键\"" +

"\r\n\r\n内容";

 



代码
1.表示一个表单项的对象

[csharp]  

 

/// <summary>  

/// 表单数据项  

/// </summary>  

public class FormItemModel  

{  

    /// <summary>  

    /// 表单键,request["key"]  

    /// </summary>  

    public string Key { set; get; }  

    /// <summary>  

    /// 表单值,上传文件时忽略,request["key"].value  

    /// </summary>  

    public string Value { set; get; }  

    /// <summary>  

    /// 是否是文件  

    /// </summary>  

    public bool IsFile  

    {  

        get  

        {  

            if (FileContent==null || FileContent.Length == 0)  

                return false;  

  

            if (FileContent != null && FileContent.Length > 0 && string.IsNullOrWhiteSpace(FileName))  

                throw new Exception("上传文件时 FileName 属性值不能为空");  

            return true;  

        }  

    }  

    /// <summary>  

    /// 上传的文件名  

    /// </summary>  

    public string FileName { set; get; }  

    /// <summary>  

    /// 上传的文件内容  

    /// </summary>  

    public Stream FileContent { set; get; }  

}  


2.提交表单主逻辑实现

[csharp]  

 

/// <summary>  

/// 使用Post方法获取字符串结果  

/// </summary>  

/// <param name="url"></param>  

/// <param name="formItems">Post表单内容</param>  

/// <param name="cookieContainer"></param>  

/// <param name="timeOut">默认20秒</param>  

/// <param name="encoding">响应内容的编码类型(默认utf-8)</param>  

/// <returns></returns>