Byte[] Copy
IServiceProvider provider = (IServiceProvider)HttpContext.Current;HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[] bs = wr.GetPreloadedEntityBody();
long length = long.Parse(wr.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength));
int bytesRead = 0; // 已读数据大小
int count = 4096; // 分块大小
if (!wr.IsEntireEntityBodyIsPreloaded())
{
using (FileStream fs = new FileStream(@"E:\1.txt", FileMode.Create, FileAccess.Write))
{
while (wr.IsClientConnected() && !wr.IsEntireEntityBodyIsPreloaded() && bytesRead < length)
{
// 如果最后一块大小小于分块大小,则重新分块
if (length - count >= bytesRead)
bs = new byte[count];
else
bs = new byte[length - bytesRead];
// 分块读取
wr.ReadEntityBody(bs, bs.Length);
fs.Write(bs,0,bs.Length);
// 记录已上传大小
bytesRead += count;
}
}
}
求助为何byte copy过去后 文件二进制数据不同?不能打开啊?
--------------------编程问答-------------------- 用16进制编辑器或者文件比较工具(推荐UltraEdit带的UltraComparer)比较下看看。 --------------------编程问答--------------------
比较了 就是不同 不知道为什么 HttpWorkerRequest 的ReadEntityBody 读出来的不一样 --------------------编程问答-------------------- 怎么木有人啊~~~~~~~~~~~~~~~ --------------------编程问答-------------------- 木有人用过这个啊 ~~~ --------------------编程问答-------------------- 因为有些代码没有,所以有些东西不太清楚
我怀疑有个问题就是count ,这个变量应该随读取的变化而变化而不是一个固定值。
类似这样
count=wr.ReadEntityBody(bs, bs.Length);
fs.Write(bs,0,count);
// 记录已上传大小
bytesRead += count;
除非你确保每次明确无误读取4096个字节
最好自己调试一下。
--------------------编程问答--------------------
我就是自己调试了很久 读出来的二进制和源文件不一样。。count我回去在试试。我觉得应该不是这个问题,count的意思是当数据大于4096的时候 我每次都读4096字节,小与这个count的时候 我就读完剩下的字节。我用filestream write的时候 字节都没读错,我主要是想实现大文件带进度上传 试了很多用.net的fileupLoad大文件可以传 但是看不到进度。 ashx不知道为什么设置了maxRequestSize 不起作用。遇到大文件容易出错。然后看网上说用这个可以一块块的读,但是读的和源文件都不一样,不知道是不是编码有问题??
补充:.NET技术 , ASP.NET