zoukankan      html  css  js  c++  java
  • asp.net上传图片所遇到的问题

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

    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         }
    View Code

    后来我想可能这只对于压缩数据量大的才会有明显效果,谁知道的,希望能解释一下。

    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         }
    View Code
     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         }
    View Code

    上面代码是我改过的,方法的参数开始我传的是HttpPostedFile对象,后来改成了byte[]参数

    在这个方法中已经读取了一次,在接下来调用webservice的上传方法,又使用了HttpPostedFile.InputStream.Read()方法,因为第二次就读取不到数据,所以就读取一次,直接传byte[]数组。

    总结:

    通过InputStream.Read()方法把当前流读取到字节序列后,InputStream流数据就不能二次使用了,这个过程相当于移动的过程,而不是复制。看来我得补充一下C#的IO知识。

    。。。。第一次写博客,问题表达不清楚,多多指教啊,继续努力,还能进步。

  • 相关阅读:
    本周学习小结(04/11
    学习笔记之知识图谱 (Knowledge Graph)
    本周学习小结(28/10
    本周学习小结(21/10
    条件分页 代替离线查询
    Apache POI 一键上传(导入excel文件到数据库)
    easyui 菜单按钮&提示框
    Jquery ztree树插件
    Jquery ztree树插件2
    ui
  • 原文地址:https://www.cnblogs.com/hyxh/p/3137628.html
Copyright © 2011-2022 走看看