最近做上传图片功能时,遇到的一些问题,在这里记录一下,以便备忘
1.关于数据压缩的问题(压缩后byte[]数组的长度反而更大)
因为图片和网站是分开的,我这里上传图片用的是webservice,为了能够减少数据传输量,同时使用了数据解压缩,代码如下:
数据解压缩帮助类
1 public class DataCompressor 2 { 3 /// <summary> 4 /// 压缩 5 /// </summary> 6 /// <param name="decompressedData"></param> 7 /// <returns></returns> 8 public static byte[] Compress(byte[] decompressedData) 9 { 10 using (MemoryStream stream = new MemoryStream()) 11 { 12 DeflateStream stream3 = new DeflateStream(stream, CompressionMode.Compress, true); 13 stream3.Write(decompressedData, 0, decompressedData.Length); 14 stream3.Close(); 15 return stream.ToArray(); 16 } 17 } 18 /// <summary> 19 /// 解压缩 20 /// </summary> 21 /// <param name="compressedData"></param> 22 /// <returns></returns> 23 public static byte[] Decompress(byte[] compressedData) 24 { 25 using (MemoryStream stream = new MemoryStream(compressedData)) 26 { 27 using (DeflateStream stream3 = new DeflateStream(stream, CompressionMode.Decompress)) 28 { 29 return LoadToBuffer(stream3); 30 } 31 } 32 } 33 34 private static byte[] LoadToBuffer(Stream stream) 35 { 36 using (MemoryStream stream2 = new MemoryStream()) 37 { 38 int num; 39 byte[] buffer = new byte[0x400]; 40 while ((num = stream.Read(buffer, 0, buffer.Length)) > 0) 41 { 42 stream2.Write(buffer, 0, num); 43 } 44 return stream2.ToArray(); 45 } 46 }
后来我想可能这只对于压缩数据量大的才会有明显效果,谁知道的,希望能解释一下。
2.关于HttpPostedFile.InputStream.Read()方法
遇到这个问题是因为我做图片上传的功能时,考虑到用户上传图片的正确性和安全性,把HttpPostedFile对象传给了一个验证文件内容是否真的图片,代码如下:
1 /// <summary> 2 /// 上传前的图片是否可靠 3 /// </summary> 4 public static bool IsSecureUploadPhoto(byte[] data) 5 { 6 FileExtension[] fe = { FileExtension.BMP, FileExtension.GIF, FileExtension.JPG, FileExtension.PNG }; 7 8 if (IsAllowedExtension(data, fe)) 9 return true; 10 else 11 return false; 12 }
1 public static bool IsAllowedExtension(byte[] data, FileExtension[] fileEx) 2 { 3 MemoryStream ms = new MemoryStream(data); 4 System.IO.BinaryReader br = new System.IO.BinaryReader(ms); 5 string fileclass = ""; 6 byte buffer; 7 try 8 { 9 buffer = br.ReadByte(); 10 fileclass = buffer.ToString(); 11 buffer = br.ReadByte(); 12 fileclass += buffer.ToString(); 13 } 14 catch { } 15 br.Close(); 16 ms.Close(); 17 foreach (FileExtension fe in fileEx) 18 { 19 if (Int32.Parse(fileclass) == (int)fe) return true; 20 } 21 return false; 22 }
上面代码是我改过的,方法的参数开始我传的是HttpPostedFile对象,后来改成了byte[]参数
在这个方法中已经读取了一次,在接下来调用webservice的上传方法,又使用了HttpPostedFile.InputStream.Read()方法,因为第二次就读取不到数据,所以就读取一次,直接传byte[]数组。
总结:
通过InputStream.Read()方法把当前流读取到字节序列后,InputStream流数据就不能二次使用了,这个过程相当于移动的过程,而不是复制。看来我得补充一下C#的IO知识。
。。。。第一次写博客,问题表达不清楚,多多指教啊,继续努力,还能进步。