二进制上传WCF损坏.mov文件

时间:2012-04-25 15:26:18

标签: c# .net wcf-data-services fiddler

我正在尝试将视频文件.mov从我的Fiddle调试器上传到远程Web服务来测试服务,但是存储在磁盘上的文件是否已损坏?有什么建议吗?

请求标题

Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
User-Agent: Fiddler
Host: localhost:2487
Content-Length: 2113228

请求正文

---------------------------acebdf13572468
Content-Disposition: form-data; name="IMG_0888.MOV"; filename="IMG_0888.MOV"
Content-Type: video/quicktime

<@INCLUDE *C:\Users\Amrit\Desktop\IMG_0888.MOV*@>
---------------------------acebdf13572468--

C#代码

     FileStream fs = null;
            string UniqueId = this.GenerateUID();
            _fileDirectory = System.IO.Path.Combine(Constants._VideosDirectory,author_id);
            if (!Directory.Exists(_fileDirectory))
            {
                Directory.CreateDirectory(_fileDirectory);
            }
            string file = Path.Combine(_fileDirectory, "test.mov");
  //        string filePath = Path.Combine(uploadFolder, request.FileName);

            try
            {
                using (FileStream targetStream = new FileStream(file, FileMode.Create,
                                 FileAccess.Write, FileShare.None))
                {
                    //read from the input stream in 65000 byte chunks

                    const int bufferLen = 65000;
                    byte[] buffer = new byte[bufferLen];
                    int count = 0;
                    while ((count = request.Read(buffer, 0, bufferLen)) > 0)
                    {
                        // save to output stream
                        targetStream.Write(buffer, 0, count);
                    }
                    targetStream.Close();
                    return "done";
                    //sourceStream.Close();
                }
            }


            catch (Exception)
            {
                return "fail";
            }
            finally
            {

            }

1 个答案:

答案 0 :(得分:2)

正如Andras所指出的,您可能将整个请求保存到磁盘而不仅仅是内容,但更可能的是您将unicode字节顺序标记(BOM)保存到文件的开头(已完成)由一些.NET流自动完成)。

你应该做的第一件事是检查保存文件的长度到原始文件的长度,新文件的长度可能会长约3个字节,这表明已经添加了一个BOM。

要确认,请在十六进制编辑器中打开这两个文件,然后查看内容的外观,然后将其与源文件进行比较。比较两个十六进制文件时,您应该只查看前几个字符和最后几个字符(如果最后一个字符不同意味着您的流未完成而您的文件被截断,如果第一个不同则意味着您有一个BOM连接的)。

您可能需要使用的是File.WriteBytes而不是FileStream,这样可以防止包含BOM。