在 C# 中通过 HTTP 侦听器获取发布的文件

2023-12-31

我使用 C# 制作了一个简单的 http 服务器。我知道如何获取发布的数据并输出它们。这是我的 C# 代码

public static void start(){
    HttpListener listener = new HttpListener();
    listener.Prefixes.Add(new Uri("http://localhost:8080").ToString());
    istener.Start();
    while(true){
        HttpListenerContext con = listener.GetContext();
        showPostedData(con.Request);
        con.Response.StatusCode = (int)HttpStatusCode.NotFound;
        string data = "Uploaded successful";
        byte[] output = Encoding.ASCII.GetBytes(data);
        con.Response.ContentType = "text/html";
        con.Response.ContentLength64 = output.Length;
        con.Response.OutputStream.Write(output , 0, output.Length );
    }
}
public static void showPostedData(HttpListenerRequest request){
    if (!request.HasEntityBody)
    {
        return;
    }
    System.IO.Stream body = request.InputStream;
    System.Text.Encoding encoding = request.ContentEncoding;
    System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
    string text;
    if (request.ContentType != null)
    {
        text = reader.ReadToEnd();
    }
    Console.WriteLine( text );
}

我的客户端 html 表单有一个名为 file 的输入框:<input type="file" name"file">

在控制台输出是这样的: file='所选文件的路径而不是文件'

那么我如何获取已发布的文件并将它们复制到上传目录..? 抱歉我的英语不好,提前谢谢...


public static void start(){
    HttpListener listener = new HttpListener();
    listener.Prefixes.Add(new Uri("http://localhost:80").ToString());
    istener.Start();

    while(true){
        HttpListenerContext con = listener.GetContext();

        var values = new HttpNameValueCollection(ref con);
        try
        {
            Console.WriteLine(values.Files["file"].FileName);
            File.WriteAllText(values.Files["file"].FileName, values.Files["file"].FileData, Encoding.Default);
        }
        catch (Exception tr)
        {

        }
    }
}
class HTTPFormData
{
    public class File
    {
        private string _fileName;
        public string FileName { get { return _fileName ?? (_fileName = ""); } set { _fileName = value; } }

        private string _fileData;
        public string FileData { get { return _fileData ?? (_fileName = ""); } set { _fileData = value; } }

        private string _contentType;
        public string ContentType { get { return _contentType ?? (_contentType = ""); } set { _contentType = value; } }
    }

    private NameValueCollection _post;
    private Dictionary<string, File> _files;
    private readonly HttpListenerContext _ctx;

    public NameValueCollection Post { get { return _post ?? (_post = new NameValueCollection()); } set { _post = value; } }
    public NameValueCollection Get { get { return _ctx.Request.QueryString; } }
    public Dictionary<string, File> Files { get { return _files ?? (_files = new Dictionary<string, File>()); } set { _files = value; } }

    private void PopulatePostMultiPart(string post_string)
    {
        var boundary_index = _ctx.Request.ContentType.IndexOf("boundary=") + 9;
        var boundary = _ctx.Request.ContentType.Substring(boundary_index, _ctx.Request.ContentType.Length - boundary_index);

        var upper_bound = post_string.Length - 4;

        if (post_string.Substring(2, boundary.Length) != boundary)
            throw (new InvalidDataException());

        var current_string = new StringBuilder();

        for (var x = 4 + boundary.Length; x < upper_bound; ++x)
        {
            if (post_string.Substring(x, boundary.Length) == boundary)
            {
                x += boundary.Length + 1;

                var post_variable_string = current_string.Remove(current_string.Length - 4, 4).ToString();

                var end_of_header = post_variable_string.IndexOf("\r\n\r\n");

                if (end_of_header == -1) throw (new InvalidDataException());

                var filename_index = post_variable_string.IndexOf("filename=\"", 0, end_of_header);
                var filename_starts = filename_index + 10;
                var content_type_starts = post_variable_string.IndexOf("Content-Type: ", 0, end_of_header) + 14;
                var name_starts = post_variable_string.IndexOf("name=\"") + 6;
                var data_starts = end_of_header + 4;

                if (filename_index != -1)
                {
                    var filename = post_variable_string.Substring(filename_starts, post_variable_string.IndexOf("\"", filename_starts) - filename_starts);
                    var content_type = post_variable_string.Substring(content_type_starts, post_variable_string.IndexOf("\r\n", content_type_starts) - content_type_starts);
                    var file_data = post_variable_string.Substring(data_starts, post_variable_string.Length - data_starts);
                    var name = post_variable_string.Substring(name_starts, post_variable_string.IndexOf("\"", name_starts) - name_starts);
                    Files.Add(name, new File() { FileName = filename, ContentType = content_type, FileData = file_data });
                }
                else
                {
                    var name = post_variable_string.Substring(name_starts, post_variable_string.IndexOf("\"", name_starts) - name_starts);
                    var value = post_variable_string.Substring(data_starts, post_variable_string.Length - data_starts);
                    Post.Add(name, value);
                }

                current_string.Clear();
                continue;
            }

            current_string.Append(post_string[x]);
        }
    }

    private void PopulatePost()
    {
        if (_ctx.Request.HttpMethod != "POST" || _ctx.Request.ContentType == null) return;

        var post_string = new StreamReader(_ctx.Request.InputStream, _ctx.Request.ContentEncoding).ReadToEnd();

        if (_ctx.Request.ContentType.StartsWith("multipart/form-data"))
            PopulatePostMultiPart(post_string);

    }

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

在 C# 中通过 HTTP 侦听器获取发布的文件 的相关文章

  • 如何使用C#在asp.net中下载xml文件

    我正在使用网络应用程序ASP NET 与 MVC3 我是 mvc3 的新手 我的网页上有一个下载按钮 当我要单击下载按钮时 我希望能够打开该 XML 文件 我尝试过一些代码更改动作结果但我没有打开文件 通过使用下面提到的代码 我收到一个下载
  • 使用 NAudio c# 将 wma 音频流转换为 mp3 流

    我的任务是使用 NAudio 和 Lame 将 wma 音频流转换为 mp3 流 下面的代码可以很好地处理文件名 但我希望它可以使用内存流来完成 我在 NAudio 中搜索没有读取 wma 音频流的方法 NAudio 可以吗 public
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • 将包含驱动器号的相对路径转换为 ​​.NET 文件函数的绝对路径

    如何转换驱动器相对路径 例如D test xml进入绝对路径 例如函数XDocument Load 会接受 D盘可能有D data作为其当前工作目录 例如 soD test xml意思是D data test xml 我已经尝试过这样的混合
  • 演示如何在 C# 4.0 中使用新的“dynamic”关键字

    这是 4 0 版本中新的 C 未来 称为动态 告诉我如何在我的代码中使用它以及这个未来可以如何帮助我 相关问题 新的 dynamic C 4 0 关键字是否弃用了 var 关键字 https stackoverflow com questi
  • 使用 TFS API 在单个查询中检索工作项及其链接的工作项

    有谁知道是否可以检索工作项目及其列表链接的工作项使用 TFS API Web 服务从 TFS 进行一趟 目前 我们必须对第一次调用期间进行的每个工作项进行第二次调用 并且引入了性能问题 如果这不可能 是否有办法查看链接工作项的类型而不检索它
  • 在 C# 中将平面数据库结果集转换为分层对象集合

    我有一个数据库查询 它以平面格式返回分层数据 例如客户 订单和订单项目 只是一个例子 我的数据不同 如何将其转换为分层对象集合 即客户对象的集合 其中每个客户对象都有订单对象的集合 每个订单对象都有订单项目对象的集合 这只是循环遍历每个项目
  • 如何在 asp.net C# 4.0 中调用异步方法?

    我知道 net 4 5 中有await async 关键字 可以轻松调用异步方法 我目前正在研究如何在 C 4 0 中进行异步调用 我想要的一个例子是在数据网格正在进行数据绑定的情况下进行异步调用 如果您能为我提供一些链接 我将非常感激 看
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • MVC 2.0 电子商店中类别名称的动态路由

    我目前正在使用 ASP NET MVC 2 0 开发一家电子商店 我已经启动并运行了大部分内容 但一直困扰我的部分是路由 我要这个 http mystore somewhere my category 1 http mystore some
  • C# ConcurrentDictionary 如何更新值属性?

    我存储这个类 public class Customer public string Firstname get set public string Lastname get set public string CustID get set
  • 将 C# 应用程序与 Oracle 10g 连接:ORA-12154: TNS: 无法解析指定的连接标识符

    我是数据库工作的初学者 我正在尝试从 C 应用程序访问 Oracle10g 数据库 但是当我这样做时 我收到此错误 ORA 12154 TNS 无法解析指定的连接标识符 我正在使用以下代码 string oradb Data Source
  • 跨线程操作在BackgroundWorker中无效

    我想在数据网格视图中显示有关表单加载的一些数据 我想要显示的数据有大量行 当我使用后台工作处理器时 它向我显示以下错误 My code private void backgroundWorker1 DoWork object sender
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 使用 WPF 和数据绑定将文件拖放到应用程序窗口中

    我希望能够将文件 例如从桌面或资源管理器 拖放到 WPF 应用程序的主窗口中 我也不希望有任何代码隐藏 即我想使用数据绑定 到目前为止 我测试了 gong wpf dragdrop 它似乎不支持应用程序外部的拖动目标 我可以将文件拖放到主窗
  • 将按钮列添加到数据表

    我试图将按钮列插入到数据表中 但它说这是一个错误 有什么帮助吗 ButtonColumn col new ButtonColumn col CommandName select col ButtonType ButtonColumnType
  • Windows 服务的 Log4net

    这是我第一次使用Log4net 它没有显示任何错误 但没有写入文件 我在我的中添加了以下内容AppConfig file
  • 安装项目 - 允许多次安装同一 Windows 服务

    我有一个关于 Net c 语言 Framework 4 0 中设置项目的问题 我为 Windows 服务创建了一个安装项目 在安装向导中 用户必须输入要安装的 Windows 服务的名称 安装程序还会创建卸载程序的快捷方式 以防用户想要删除
  • 在方法签名中使用 new 关键字通常只是为了可读性吗?

    我读过关于new关键词在方法签名中并看到了下面的例子this https stackoverflow com questions 1014295 c sharp new keyword in method signature发帖了 但还是不

随机推荐

  • 码头工人。 MySQL 图像。无法更改 my.cnf 文件

    我有这样一个docker compose yml database container name test db image mysql 5 7 volumes docker my cnf etc my cnf environment MY
  • 如何检测 NSString 是否包含特定字符?

    我有一个 NSString 对象 例如 45 0000 现在我想知道这个字符串是否包含 我怎样才能做到这一点 您是否想查找它是否至少包含以下一项 or 您可以使用 rangeOfCharacterFromSet NSCharacterSet
  • 复制没有历史记录的 git 存储库

    我在 GitHub 上有一个私人存储库 我想将其公开 但是 一些初始提交包含我不想公开的信息 硬编码凭据等 在不包含部分或全部提交历史记录的情况下 公开最新提交 我真的不需要或不希望公共存储库中的先前提交 的最简单方法是什么 您可以限制历史
  • 如何在Web应用程序中使复选框只读

    我有一个网格视图 每一行都有一个复选框 当进入编辑模式时 可以选中 取消选中复选框 但我不希望该复选框在任何其他模式下都是可编辑的 用户可能很容易对不反映保存回数据库中的真实值的复选框感到困惑
  • 使用for循环批量重命名文件

    我正在尝试使用 for 循环来重命名文件 Echo Off setlocal enableDelayedExpansion Set Date set mydate DATE 10 4 DATE 4 2 DATE 7 2 Rename fil
  • 拆分逗号分隔的字符串并在 C# 中添加引号 - 优雅的解决方案

    我有一个string看起来像这样 var v 10 14 18 21 并想将其用作如下所示的东西 10 14 18 21 我写了一个函数 它将值分割为comma并将它们作为字符串添加在一起 另外我删除了最后一个 从结果字符串 我把所有东西都
  • DQL 返回实体数组而不是对象

    通常 如果我运行如下所示的 DQL 查询 它将返回实体对象列表 d this gt getDoctrine gt getRepository xxxWebsiteBundle Locations gt createQueryBuilder
  • 为什么用户可以设置新密码,而无需输入与我的批处理代码正确的旧密码?

    我最近写了一个文件夹锁定程序 我唯一的问题是当我需要更改密码时 例如我去部分newpass 该程序似乎不会将旧密码与新密码进行比较 而只是使用给定的任何输入 这违背了拥有密码的目的 因为每个人都可以更改密码 而不是用它解锁文件夹 有人可以仔
  • 在 Chrome 中重新加载动画 GIF 时出现问题

    我有一个可以重新加载 gif 动画的应用程序 它在 Safari 中始终有效 但在 Chrome 中时断时续 我相信这个问题与提到的问题类似here https groups google com forum topic shiny dis
  • Excel - 基于ID的工作表值查找[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有两张工作表 第一个列出了我的客户
  • 如何获取处理器和硬盘的制造序列号和 ID?

    如何使用 Matlab 获取以下硬件属性 主板制造序列号 处理器 ID 处理器制造序列号 硬盘ID 硬盘制造序列号 是否有任何函数或类负责检测其他机器硬件组件属性的属性 我知道可以使用系统或控制台命令来完成 但我不知道如何完成 不过 我更喜
  • 将 1 亿个文件写入 s3

    我的主要目标是根据每条记录的 id 将记录拆分为文件 目前有超过 150 亿条记录 而且肯定还会增加 我需要一个使用 Amazon EMR 的可扩展解决方案 我已经为一个包含大约 9 亿条记录的较小数据集完成了这项工作 输入文件采用 csv
  • Gensim LDA 中的主题明智文档分布

    python 有没有办法映射属于某个主题的文档 例如 主要是 主题 0 的文档列表 我知道有多种方法可以列出每个文档的主题 但我该如何反过来呢 Edit 我正在使用以下 LDA 脚本 doc set for file in files ne
  • 如何在 Visual Studio 2010 中构建这个简单的 C++/SWIG/C# 项目?

    我需要帮助设置一个简单的 C C SWIG 项目 我很难将使用 SWIG 绑定的 C 项目组合在一起 我正在使用 Visual Studio 2010 和最新版本的 SWIG 我的代码很简单 cpp 文件 h pragma once cla
  • 是否有任何方便的代码覆盖率工具可与 JUnit 一起使用?

    是否有方便的代码覆盖率工具可与 JUnit 一起使用 我想大多数代码覆盖率工具都可以很容易地与 JUnit 一起使用 以前我用过EMMA http emma sourceforge net 这很好 如果您是 Eclipse 用户 有一个 E
  • 如何以编程方式清空浏览器缓存?

    我正在寻找一种以编程方式清空浏览器缓存的方法 我这样做是因为应用程序会缓存机密数据 并且我想在您按 注销 时删除这些数据 这可以通过服务器或 JavaScript 发生 当然 仍然不鼓励在外国 公共计算机上使用该软件 因为存在更多危险 例如
  • 如何在 Mongoose 中验证数组及其元素

    我有这个模式 我在其中验证了数组的元素book 但我不知道如何验证数组本身 var DictionarySchema new Schema book 1 type String required true 2 String 3 String
  • 我可以从运行时加载的共享对象访问主机进程的符号吗?还有其他选择吗?

    在我的场景中 我想要一个插件 它是在运行时加载的共享对象 用于访问 主机应用程序 中的符号 以便我可以向我的应用程序添加任何功能 我已经尝试过 但没有找到任何方法来做到这一点 而且我不知道这是否可能 那么 我可以以某种方式做到这一点 或者使
  • 为什么 `add cl, 2` 以 x86 十六进制打印 `80 c1 02`?

    试图缩小我的问题范围 以便我能够克服这个障碍 This https stackoverflow com questions 28664856 how to interpret x86 opcode map noredirect 1 comm
  • 在 C# 中通过 HTTP 侦听器获取发布的文件

    我使用 C 制作了一个简单的 http 服务器 我知道如何获取发布的数据并输出它们 这是我的 C 代码 public static void start HttpListener listener new HttpListener list