我正在尝试将视频文件.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
{
}
答案 0 :(得分:2)
正如Andras所指出的,您可能将整个请求保存到磁盘而不仅仅是内容,但更可能的是您将unicode字节顺序标记(BOM)保存到文件的开头(已完成)由一些.NET流自动完成)。
你应该做的第一件事是检查保存文件的长度到原始文件的长度,新文件的长度可能会长约3个字节,这表明已经添加了一个BOM。
要确认,请在十六进制编辑器中打开这两个文件,然后查看内容的外观,然后将其与源文件进行比较。比较两个十六进制文件时,您应该只查看前几个字符和最后几个字符(如果最后一个字符不同意味着您的流未完成而您的文件被截断,如果第一个不同则意味着您有一个BOM连接的)。
您可能需要使用的是File.WriteBytes
而不是FileStream
,这样可以防止包含BOM。