使用Stream进行byte[]进行转换时要注意的事

最近在做项目的时候为了对付NLB,把原来附件保存到Web服务器的方式改成了保存到数据库的方式。
这样改动后,一般的附件上传没有问题,但是有一个做了Hash校验的附件上传页面却很奇怪的在数据库中只保存了大量的0,也就是说附件的内容全是0.查看其代码如下:
if (IsAllowFile(name))//判断文件类型是否允许
{
if (MD5File.Check(files[i].InputStream, key))
{
string fileName;
int len = files[i].ContentLength;
byte[] content = new byte[len];
files[i].InputStream.Read(content, 0, len);
string guid = AttachmentFile.AddFile(name, files[i].ContentType, content);//保存到数据库
fileName = "../File.aspx?guid=" + guid;
}
else
{
denyFiles += name + "\\r";
}
}

这个地方就是将一个Stream转换为byte[],然后将byte[]存入数据库中。那么为什么byte[] content会全是0拉?原来是在执行Read()函数之前调用了MD5File.Check函数,而这个函数也是将上传的文件流作为参数传入,在内也执行了Read()函数实现将Stream转换为byte[]。
原因是Stream内部有一个指针Position表示当前操作的位置,当执行了一次Read函数后Position移动到了一定长度的位置,在第二次执行Read函数时候,Stream会根据新的Position继续读取数据,由于第一次读取的时候已经把Position设置到了Stream的终点,所以第二次读取的时候并没有把Stream中的内容读取到byte[]中。
解决办法也比较简单,在Read方法调用之前,加入files[i].InputStream.Position = 0;就可以将Stream中的内容读取到byte[]中了。

时间: 2024-09-15 20:16:22

使用Stream进行byte[]进行转换时要注意的事的相关文章

C# Stream 和 byte[] 之间的转换

原文:C# Stream 和 byte[] 之间的转换 Stream 和 byte[] 之间的转换   /* - - - - - - - - - - - - - - - - - - - - - - - - * Stream 和 byte[] 之间的转换 * - - - - - - - - - - - - - - - - - - - - - - - */ /// /// 将 Stream 转成 byte[] /// public byte[] StreamToB

C# Stream 和 byte[] 之间的转换_C#教程

/* - - - - - - - - - - - - - - - - - - - - - - - -   * Stream 和 byte[] 之间的转换  * - - - - - - - - - - - - - - - - - - - - - - - */ /// <summary> /// 将 Stream 转成 byte[] /// </summary> public byte[] StreamToBytes(Stream stream) {     byte[] bytes 

asp.net File,FileStream,byte应用转换

asp教程.net file,filestream,byte应用转换 file>>>filestream (2种方式) 方式1: filestream fs1 = file.open ( @"d:集团通知.jpg" , filemode.open ); 方式2: filestream fs2 = new filestream ( @"d:通知.jpg" , filemode.open ); filestream>>>byte[]

对象布局已知时 C++ 对象指针的转换时地址调整

在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时,编译器会根据对象布局对相应的指针的值进行调整.不管是 microsoft 的编译器,还是 gcc 编译器都会做这个动作,因为这和 C++ 对象模型有关.   举一个简单的例子,如下代码:   #include <stdio.h> class A { public: int x; void foo

js数值和和字符串进行转换时可以对不同进制进行操作

 这篇文章主要介绍了js数值和和字符串进行转换时可以对不同进制进行操作,需要的朋友可以参考下 Javascript数值和和字符串进行转换时,可以对不同的进制进行操作.    转换例子如下:   代码如下: <html>    <head>  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  <title>带进制的数值和字符串间进行

字符-java 中byte数组转换问题,求思路

问题描述 java 中byte数组转换问题,求思路 现在做的项目有一个byte数组转换的问题,思考很久没有思路,求各路大神给点意见. 需求 :将一个byte数组中的每个元素拆分成两个byte.分别保存前一个byte中的16进制两位的内容的ascii码. 事例 : byte[] a = {0x24,0xBD}; byte[] b = new byte[4]; 想得到的结果: b[0] == 0x32; b[1] == 0x34; b[2] == 0x42; b[3] == 0x44;

窗体-C#-当从一个数字执行强制转换时,值必须是一个小于无限大的数

问题描述 C#-当从一个数字执行强制转换时,值必须是一个小于无限大的数 OldDbDataReader reader = new OldDbDataReader(); long price = new long(); if(reader.read()) price = (long)reader["PRICE"]; 报错说强制类型转换出错,并说"当从一个数字执行强制转换时,值必须是一个小于无限大的数".数据库PRICE字段设置成了"数字",是长整型

java-使用simpledateformat转换时出现了32号

问题描述 使用simpledateformat转换时出现了32号 java中使用simpledateformat格式化日期,出现了2016-03-32 00:00:00,秒数是1459440000,但是只出现过一次,非必现,有大牛知道这是为什么吗...? 解决方案 线程安全的问题!http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html 解决方案二: 怎么可能呢,应该其他的问题

dalvik-在做xml与java实体类的转换时,导入的jar包都会让eclipse报错

问题描述 在做xml与java实体类的转换时,导入的jar包都会让eclipse报错 我开始用XStream,后来又根据网上的代码导入javax.xml.bind包来进行解析,但是这两种都会报错:Conversion to Dalvik format failed with error 1,我百了一下,也不是很明白,还请大家解答,先谢谢各位了.. 解决方案 可以试下这个方案http://dev.wo.com.cn/docportal/doc_queryMdocDetail.action?mdoc