将文件从 Flex 上传到 WCF REST Stream 问题(如何在 REST WS 中解码多部分表单发布)

问题描述 投票:0回答:3

该系统是一个与 WCF REST Web 服务通信的 Flex 应用程序。 我正在尝试将文件从 Flex 应用程序上传到服务器,但遇到了一些问题,我希望这里有人能够提供帮助。 我正在 Flex 应用程序中使用 FileReference 来浏览和上传此处定义的文件:

http://blog.flexexamples.com/2007/09/21/uploading-files-in-flex-using-the-filereference-class/

然后,我在 WCF REST Web 服务中以流形式接收文件(在调试器中显示为 System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream)(使用 WCF 4 REST 服务的项目类型)

[WebInvoke(Method = "POST", UriTemplate = "_test/upload")]
public void UploadImage(Stream data)
{
    // TODO: just hardcode filename for now
    var filepath = HttpContext.Current.Server.MapPath(@"~\_test\testfile.txt");
    using (Stream file = File.OpenWrite(filepath))
    {
        CopyStream(data, file);
    }
}
private static void CopyStream(Stream input, Stream output)
{
    var buffer = new byte[8 * 1024];
    int len;
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, len);
    }
}

注意:这篇文章中使用的 CopyStream 方法:如何将流保存到 C# 中的文件?

文件保存没有任何问题。 我遇到的问题是该文件包含的信息比我想要的更多。 以下是保存文件的内容(其中源文件仅包含“这是文件的内容”):

------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2
Content-Disposition: form-data; name="Filename"

testfile.txt
------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2
Content-Disposition: form-data; name="Filedata"; filename="testfile.txt"
Content-Type: application/octet-stream

THIS IS THE CONTENT OF THE FILE
------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2
Content-Disposition: form-data; name="Upload"

Submit Query
------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2--

内容看起来与 Adobe 文档中描述的完全一样: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html

C# 中是否有任何工具可以从 Stream 中获取文件内容?

编辑(3/24 8:15 pm):Flex 应用程序发送的是多部分表单 POST。 如何解码 Stream 参数表示的多部分正文数据并删除多部分正文的各个部分?

提前致谢。

c# wcf apache-flex rest stream
3个回答
6
投票

我开源了一个 C# Http 表单解析器 here

这比 CodePlex 上提到的另一个稍微灵活一些,因为您可以将它用于多部分和非多部分

form-data
,并且它还为您提供以
Dictionary
对象格式化的其他表单参数。

可以按如下方式使用:

非多部分

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

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

多部分

public void Upload(Stream stream)
{
    HttpMultipartParser parser = new HttpMultipartParser(data, "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);
    }
}

5
投票

感谢 Anthony 在 http://antscode.blogspot.com/ 提供的多部分解析器,效果非常好(对于图像、txt 文件等)。

http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html


1
投票

我遇到了一些基于字符串解析的解析器问题,特别是对于大文件,我发现它会耗尽内存并且无法解析二进制数据。

为了解决这些问题,我开源了我自己在 C# 多部分/表单数据解析器方面的尝试 here

请参阅我的回答此处了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.