使用 .NET(控制台应用程序)发布多个文件和表单值

2023-11-24

我想将多个文件和表单变量发布到 CGI 脚本,全部在oneHTTP 请求。我相信这需要一个 HTTP postmultipart/form-data编码。以下是发送所需信息的 HTML 表单示例;我需要通过应用程序发送相同的信息:

<form action="/process.php" enctype="multipart/form-data" method="post">
<input type="text" name="foo" value="bar">
<input type="text" name="blah" value="baz">
<input type="file" name="file1">
<input type="file" name="file2">
<input type="file" name="file3">
</form>

请注意,该应用程序是 C# .NET GUI(或控制台)应用程序,而不是 ASP.Net 应用程序。


我去年根据我发现的一些代码做到了这一点。它完全支持您想要的内容,包括文件和值。

这是一个名为HttpForm:

public class HttpForm {

    private Dictionary<string, string> _files = new Dictionary<string, string>();
    private Dictionary<string, string> _values = new Dictionary<string, string>();

    public HttpForm(string url) {
        this.Url = url;
        this.Method = "POST";
    }

    public string Method { get; set; }
    public string Url { get; set; }

    //return self so that we can chain
    public HttpForm AttachFile(string field, string fileName) {
        _files[field] = fileName;
        return this;
    }

    public HttpForm ResetForm(){
        _files.Clear();
        _values.Clear();
        return this;
    }

    //return self so that we can chain
    public HttpForm SetValue(string field, string value) {
        _values[field] = value;
        return this;
    }

    public HttpWebResponse Submit() {
        return this.UploadFiles(_files, _values);
    }


    private HttpWebResponse UploadFiles(Dictionary<string, string> files, Dictionary<string, string> otherValues) {
        var req = (HttpWebRequest)WebRequest.Create(this.Url);

        req.Timeout = 10000 * 1000;
        req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        req.AllowAutoRedirect = false;

        var mimeParts = new List<MimePart>();
        try {
            if (otherValues != null) {
                foreach (var fieldName in otherValues.Keys) {
                    var part = new MimePart();

                    part.Headers["Content-Disposition"] = "form-data; name=\"" + fieldName + "\"";
                    part.Data = new MemoryStream(Encoding.UTF8.GetBytes(otherValues[fieldName]));

                    mimeParts.Add(part);
                }
            }

            if (files != null) {
                foreach (var fieldName in files.Keys) {
                    var part = new MimePart();

                    part.Headers["Content-Disposition"] = "form-data; name=\"" + fieldName + "\"; filename=\"" + files[fieldName] + "\"";
                    part.Headers["Content-Type"] = "application/octet-stream";
                    part.Data = File.OpenRead(files[fieldName]);

                    mimeParts.Add(part);
                }
            }

            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");

            req.ContentType = "multipart/form-data; boundary=" + boundary;
            req.Method = this.Method;

            long contentLength = 0;

            byte[] _footer = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");

            foreach (MimePart part in mimeParts) {
                contentLength += part.GenerateHeaderFooterData(boundary);
            }

            req.ContentLength = contentLength + _footer.Length;

            byte[] buffer = new byte[8192];
            byte[] afterFile = Encoding.UTF8.GetBytes("\r\n");
            int read;

            using (Stream s = req.GetRequestStream()) {
                foreach (MimePart part in mimeParts) {
                    s.Write(part.Header, 0, part.Header.Length);

                    while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0)
                        s.Write(buffer, 0, read);

                    part.Data.Dispose();

                    s.Write(afterFile, 0, afterFile.Length);
                }

                s.Write(_footer, 0, _footer.Length);
            }

            var res = (HttpWebResponse)req.GetResponse();

            return res;
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
            foreach (MimePart part in mimeParts)
                if (part.Data != null)
                    part.Data.Dispose();

            return (HttpWebResponse)req.GetResponse();
        }
    }

    private class MimePart {
        private NameValueCollection _headers = new NameValueCollection();
        public NameValueCollection Headers { get { return _headers; } }

        public byte[] Header { get; protected set; }

        public long GenerateHeaderFooterData(string boundary) {
            StringBuilder sb = new StringBuilder();

            sb.Append("--");
            sb.Append(boundary);
            sb.AppendLine();
            foreach (string key in _headers.AllKeys) {
                sb.Append(key);
                sb.Append(": ");
                sb.AppendLine(_headers[key]);
            }
            sb.AppendLine();

            Header = Encoding.UTF8.GetBytes(sb.ToString());

            return Header.Length + Data.Length + 2;
        }

        public Stream Data { get; set; }
    }
}

你可以这样使用它:

var file1 = @"C:\file";
var file2 = @"C:\file2";

var yourUrl = "http://yourdomain.com/process.php";
var httpForm = new HttpForm(yourUrl);
httpForm.AttachFile("file1", file1).AttachFile("file2", file2);
httpForm.setValue("foo", "some foo").setValue("blah", "rarrr!");
httpForm.Submit();

请让我知道这对你有没有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 .NET(控制台应用程序)发布多个文件和表单值 的相关文章

  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Clojure 宏将保留关联映射顺序

    作为前言 我在 Windows 7 64 位 上运行 Java 版本 6 更新 33 使用clooj作为我的 IDE 我没有尝试在任何其他系统中重现我的问题 我对 Clojure 有经验 但对 Java 一点经验都没有 我试图解决的整个问题
  • Firebase 存储安全规则 400 错误问题“权限被拒绝。无法访问存储桶 xxxxx-****.appspot.com”

    尝试上传照片时 我不断从 firebase 链接收到消息错误 提示我的 React 项目中的 firebase 存储上传出现 400 错误 之前一切正常并成功上传图像 但现在它停止上传照片 出现以下错误 我不知道问题出在哪里 检查中提示出来
  • Horner 小数部分递归算法 - Java

    我正在尝试创建一个递归方法 使用 Horner 算法将以 n 为基数的小数转换为以 10 为基数的小数 我在这里和各处进行了搜索 但找不到任何详细处理小数部分的地方 需要注意的是 我在递归方面非常薄弱 因为我还没有在编程课程中正式学习它 但
  • 我需要一个 MSI 自定义操作来从 MSI 源目录复制文件

    我正在使用 VS 2008 为 c windows 项目创建一个安装程序 我正在尝试编写一个自定义操作 该操作从存储在文件服务器上的 MSI 文件的源目录复制设置文件 例如 server fileshare myappinstaller m
  • Spring REST 服务:如何配置以删除 json 响应中的空对象

    我有一个返回 json 响应的 Spring Web 服务 我使用此处给出的示例来创建服务 http www mkyong com spring mvc spring 3 mvc and json example 返回的json格式为 na
  • 配置 Tomcat 以使用 Windows 证书存储进行 SSL

    我已经部署了许多 SSL 配置 包括 Tomcat cacerts keytool 和 IIS Windows 证书存储 netsh http sslcert 因此我熟悉这些过程 有没有人想出一种方法将 Tomcat 的 SSL 连接器指向
  • 可以允许来自 HTTPS 网站的 HTTP 请求吗?

    我已经安装了 非通配符 SSL 证书 以便我的网站可以使用 HTTPS 当我尝试从 HTTP url 请求资源时 我收到如下错误消息 混合内容 页面位于 https example com 已加载完毕 HTTPS 但请求不安全的样式表 ht
  • JsonSchema:根据另一个属性的值验证类型

    我正在使用以下架构来验证我的 json schema http json schema org schema title Rules description Describes a set of rules type object prop
  • 无法从 Microsoft Graph Explorer 更新 Sharepoint 托管元数据字段

    我正在尝试通过 Graph Explorer 更新与列表项关联的字段 https developer microsoft com en us graph graph explorer 或 REST API 调用 对于其中一个字段 其值可以是
  • Apache Camel Http 和 SSL

    我一直在尝试获得与 Camel 一起使用的 2 路 ssl https 代理 我已经能够使用 2 路 ssl 设置 Jetty 组件 现在尝试让它与 Http4 组件一起工作以完成代理的客户端 当我将码头流量路由到日志组件时 一切都很好 并
  • Weka GUI - 内存不足,无法加载?

    我过去也曾加载过同样的 Weka 安装 我只是尝试加载 Weka GUI 双击图标 但出现以下错误 我该如何修复它 OutOfMemory Not enough memory Please load a smaller dataset or
  • 无法在当前目录中获取脚本源

    显然 我不能source脚本 如果该脚本位于当前目录中 例如 source some dir script sh Ok 工作正常 但如果我与脚本位于同一目录中 则会出错 cd some dir source script sh sh sou
  • Java显示当前时间

    我有一个代码 可以显示运行应用程序时的当前日期和时间 DateFormat dateFormat new SimpleDateFormat yyyy MM dd HH mm ss Calendar cal Calendar getInsta
  • VIM:按函数名称排序

    我的 menu vim 文件中有很多函数 是否可以 由我 选择它们并按函数名称对它们进行排序 p e 从乐趣中找到台词 或函数 到线endfun 查找函数名称并根据函数名称对整个块进行排序 从 a z 有时我会在函数名称上方添加一行注释 可
  • CloudKit 通知

    我可能在这里遗漏了一些明显的东西 如何创建一个 CloudKit 通知 其中包含有关您收到通知的 CKRecord 的详细信息 即不仅仅是通用的 已创建新项目 而是带有记录标题的通知 例如 吉尔和杰西卡的生日派对 为每个新记录更改创建一个带
  • 如何配置 BIRT 报告引擎直接从类路径加载字体?

    我正在编写一个使用 BIRT 生成报告的 Java 应用程序 我想将自定义字体打包在 jar 文件中 并能够将它们嵌入到 PDF 报告中 我可以先将字体提取到文件系统 然后将 BIRT 指向文件系统位置 但我想知道是否可以将 BIRT 配置
  • 树枝模板内的变量 jquery

    我正在尝试使用 twig 模板内的 jquery 变量通过 ajax 发送 但我无法访问 twig 内的 jquery 变量 我的代码是
  • JPA 实体 - 指定持久性单元?

    我有一个使用多个持久性单元的 JavaEE 项目 有没有办法指定特定 JPA 实体属于哪个持久单元 一些实体位于一个数据源中 而其他实体位于我的第二个数据源中 有没有办法使用注释来区分两者 指定哪个持久单元Entity属于 使用persis
  • 为商店构建通用应用程序时出错:“清单引用文件‘MyAppName.dll’,该文件不是有效负载的一部分。”

    当尝试为 Windows 通用应用程序的商店创建应用程序包时 我在 Visual Studio 2015 中遇到此错误 清单引用文件 MyAppName dll 该文件不是有效负载的一部分 错误是在 MyAppSourcePath Pack
  • 使用 .NET(控制台应用程序)发布多个文件和表单值

    我想将多个文件和表单变量发布到 CGI 脚本 全部在oneHTTP 请求 我相信这需要一个 HTTP postmultipart form data编码 以下是发送所需信息的 HTML 表单示例 我需要通过应用程序发送相同的信息