2011-03-24 46 views
4

该系统是一个Flex应用程序,与WCF REST Web服务进行通信。我试图从Flex应用程序上传一个文件到服务器,并且遇到了一些问题,我希望这里有人能够提供帮助。 我使用的FileReference在Flex应用程序浏览和上传文件的定义如下:将文件从Flex上传到WCF REST流问题(如何解码REST WS中的多部分表单文章)

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

我则接收到的文件作为流(显示为System.ServiceModel.Dispatcher.StreamFormatter。 MessageBodyStream在WCF REST Web服务的调试器)(使用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方法:How do I save a stream to a file in 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参数表示的多部分正文数据并去除多部分正文的碎片?

EDIT(3/25上午10时):那些相关的一些堆栈溢出职位:
WCF service to accept a post encoded multipart/form-data
POSTing multipart/form-data to a WCF REST service: the action changes

EDIT(3/25 10:45):发现了一个多解析器工作得很好:
http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html

在此先感谢。

+1

你可以通过MS公共API实现这一点,请参阅http://stackoverflow.com/questions/7460088/reading-file-input-from-a-multipart-form-data-post/21689347#21689347 – 2014-02-10 22:46:43

回答

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); 
    } 
} 
1

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

为了应对这些问题,我已经开源了在C#中的multipart/form-data的解析器我自己尝试here

见我的答案here以获取更多信息。