asp.net上传图片所遇到的问题

作者:互联网   出处:控件中国网   2014-11-05 19:06:23   阅读:1

 最近做上传图片功能时,遇到的一些问题,在这里记录一下,以便备忘

 
1.关于数据压缩的问题(压缩后byte[]数组的长度反而更大)
 
因为图片和网站是分开的,我这里上传图片用的是webservice,为了能够减少数据传输量,同时使用了数据解压缩,代码如下:
 
数据解压缩帮助类
 
public class DataCompressor
     {
         /// <summary>
         /// 压缩
         /// </summary>
         /// <param name="decompressedData"></param>
         /// <returns></returns>
         public static byte[] Compress(byte[] decompressedData)
         {
             using (MemoryStream stream = new MemoryStream())
             {
                 DeflateStream stream3 = new DeflateStream(stream, CompressionMode.Compress, true);
                 stream3.Write(decompressedData, 0, decompressedData.Length);
                 stream3.Close();
                 return stream.ToArray();
             }
         }
         /// <summary>
         /// 解压缩
         /// </summary>
         /// <param name="compressedData"></param>
         /// <returns></returns>
         public static byte[] Decompress(byte[] compressedData)
         {
             using (MemoryStream stream = new MemoryStream(compressedData))
             {
                 using (DeflateStream stream3 = new DeflateStream(stream, CompressionMode.Decompress))
                 {
                     return LoadToBuffer(stream3);
                 }
             }
         }
 
         private static byte[] LoadToBuffer(Stream stream)
         {
             using (MemoryStream stream2 = new MemoryStream())
             {
                 int num;
                 byte[] buffer = new byte[0x400];
                 while ((num = stream.Read(buffer, 0, buffer.Length)) > 0)
                 {
                     stream2.Write(buffer, 0, num);
                 }
                 return stream2.ToArray();
             }
         }
后来我想可能这只对于压缩数据量大的才会有明显效果,谁知道的,希望能解释一下。
 
2.关于HttpPostedFile.InputStream.Read()方法
 
遇到这个问题是因为我做图片上传的功能时,考虑到用户上传图片的正确性和安全性,把HttpPostedFile对象传给了一个验证文件内容是否真的图片,代码如下:
 
/// <summary>
         /// 上传前的图片是否可靠
         /// </summary>
         public static bool IsSecureUploadPhoto(byte[] data)
         {
             FileExtension[] fe = { FileExtension.BMP, FileExtension.GIF, FileExtension.JPG, FileExtension.PNG };
 
             if (IsAllowedExtension(data, fe))
                 return true;
             else
                 return false;
         }
public static bool IsAllowedExtension(byte[] data, FileExtension[] fileEx)
         {
             MemoryStream ms = new MemoryStream(data);
             System.IO.BinaryReader br = new System.IO.BinaryReader(ms);
             string fileclass = "";
             byte buffer;
             try
             {
                 buffer = br.ReadByte();
                 fileclass = buffer.ToString();
                 buffer = br.ReadByte();
                 fileclass += buffer.ToString();
             }
             catch { }
             br.Close();
             ms.Close();
             foreach (FileExtension fe in fileEx)
             {
                 if (Int32.Parse(fileclass) == (int)fe) return true;
             }
             return false;
         }
 
上面代码是我改过的,方法的参数开始我传的是HttpPostedFile对象,后来改成了byte[]参数
 
在这个方法中已经读取了一次,在接下来调用webservice的上传方法,又使用了HttpPostedFile.InputStream.Read()方法,因为第二次就读取不到数据,所以就读取一次,直接传byte[]数组。
 
总结:
 
通过InputStream.Read()方法把当前流读取到字节序列后,InputStream流数据就不能二次使用了,这个过程相当于移动的过程,而不是复制。看来我得补充一下C#的IO知识。
 
。。。。第一次写博客,问题表达不清楚,多多指教啊,继续努力,还能进步。
 
Copyright© 2006-2015 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 渝ICP备12000264号 法律顾问:元炳律师事务所
客服软件
live chat