最近做上传图片功能时,遇到的一些问题,在这里记录一下,以便备忘
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知识。
。。。。第一次写博客,问题表达不清楚,多多指教啊,继续努力,还能进步。