是否有C#中的multipart/form-data解析器 -(不包括ASP)

10

我正在尝试编写一个多部分解析器,但事情变得复杂了,想问问是否有人知道C#中现成的解析器?

只是为了明确,我正在编写自己的“微型”http服务器,并需要解析多部分表单数据!

谢谢提前, Gohlool


嗯,我正在解析从浏览器接收的multipart/form-data流,通过上传文件和一些字段! - Gohlool
是的,有这个:https://dev59.com/zWs05IYBdhLWcg3wFN-8#21689347(即使它在名称中有ASP.NET,你可以在任何地方使用它,特别是你不需要在ASP.NET下运行) - Ohad Schneider
5个回答

27

我在这里开源了一个C# Http表单解析器(链接)

与CodePlex上提到的另一个解析器相比,它稍微更加灵活,因为你可以同时用于Multipart和非Multipart的form-data,并且它会将其他表单参数格式化成一个Dictionary对象。

可以按以下方式使用:

非多部分

public void Login(Stream stream)
{
    string username = null;
    string password = null;

    HttpContentParser parser = new HttpContentParser(stream);
    if (parser.Success)
    {
        username = HttpUtility.UrlDecode(parser.Parameters["username"]);
        password = HttpUtility.UrlDecode(parser.Parameters["password"]);
    }
}

多部分

public void Upload(Stream stream)
{
    HttpMultipartParser parser = new HttpMultipartParser(stream, "image");

    if (parser.Success)
    {
        string user = HttpUtility.UrlDecode(parser.Parameters["user"]);
        string title = HttpUtility.UrlDecode(parser.Parameters["title"]);

        // Save the file somewhere
        File.WriteAllBytes(FILE_PATH + title + FILE_EXT, parser.FileContents);
    }
}

1
@Gohlool 是的,HttpMultipartParser 支持由任意数量文本部分和文件部分组成的多部分表单数据。包含文件的部分名称需要作为构造函数中的第二个参数传递,并且该文件可以是任何 MIME 类型。 - Lorenzo Polidori
我已经尝试了你的代码,它运行良好,但是无法处理二进制附件(application/octet-stream)。这是由于立即转换为“string”,导致无法获取原始字节。可以检索到contentTypeMatch.Index,但contentTypeMatch.Length是错误的。对于第二个及其后续附件也不起作用(我已更改代码以支持它)。你能否建议该怎么做? - Be Brave Be Like Ukraine
@bytebuster 这种情况只发生在 HttpContentParser 中,还是在 HttpMultipartParser 中也会出现? - Lorenzo Polidori
大部分 (2012) 年的 MIT 许可代码看起来像是从 (2009) 年的 LGPL 代码中提取出来的,包括相同的注释、变量名、样式等。我不是律师,但认为衍生作品要求修改后的代码也在 LGPL 下发布。 - Joe Zack
4
Bitbucket的链接已损坏。 - Avner
显示剩余5条评论

11

我曾经在解析大文件时遇到一些基于字符串解析器的问题,特别是在解析二进制数据时,会因为内存不足而无法解析。

为了应对这些问题,我开源了自己的C# multipart/form-data解析器(点击此处)

更多信息请查看我的回答(点击此处)


这是最好的C# multipart/form-data解析器。我用过很多,但这个绝对是最好的。 - aradalvand
1
你的解析器非常好用,但是NuGet包强制我更新了System.ComponentModel.Annotations,这导致Json也需要升级,最终完全破坏了我的项目。虽然这并不是你的错,但最终我还是没能使用它。 - crthompson

1
请查看新的MultipartStreamProvider及其子类(例如MultipartFormDataStreamProvider)。如果内置实现都不适合您的用例,您也可以创建自己的实现。

1

现在有了Core,您可以使用HttpContext.Request.Form访问IFormCollection。

例如保存图片:

        Microsoft.AspNetCore.Http.IFormCollection form;
        form = ControllerContext.HttpContext.Request.Form; 

        using (var fileStream = System.IO.File.Create(strFile))
        {
            form.Files[0].OpenReadStream().Seek(0, System.IO.SeekOrigin.Begin);
            form.Files[0].OpenReadStream().CopyTo(fileStream);
        }

这并没有真正回答所提出的问题,但仍然是一个好的提示,让我找到了这个IFormCollection属性。如果你在使用.NET Core,这非常棒且轻量级。 - Felipe Romero

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接