//最后一块文件块上传完成,文件块合并好之后
if (currentBlock == FileBlocks)
{
if (File.Exists(absolutePath))
{
AddTxtLog("开始压缩包MD5校验。");
#region MD5校验及压缩包文件解压
//压缩包MD5校验
string MD5String = GetFileMD5(absolutePath);
if (MD5String.ToUpper() != toVerifyString.ToUpper())
{
result = "压缩包(" + absolutePath + ")上传不完整!传过来的MD5校验码:" + toVerifyString + ",服务器生成的校验码:" + MD5String + "。";
ExceptionHandler.HandleWebException(logger, "405", result, Context, username);
Context.Response.Write(JsonHelper.ToJson(result));
AddTxtLog(result);
return;
}
//文件解压
if ((absolutePath.EndsWith(".zip") || absolutePath.EndsWith(".rar")
|| absolutePath.EndsWith(".ZIP") || absolutePath.EndsWith(".RAR")))
{
AddTxtLog("开始压缩包文件解压。");
DeCompressFile(absolutePath, absolutePath.Substring(0, absolutePath.LastIndexOf('.')), ""); //传:压缩包文件绝对路径,压缩包解压文件夹绝对路径
}
//JSON字符串反序列化为对象
DataContractJsonSerializer deSerializer = new DataContractJsonSerializer(typeof(List<Obj_ImageValidation>));
MemoryStream memoryStre = new MemoryStream(Encoding.UTF8.GetBytes(MD5str));
List<Obj_ImageValidation> MD5check = deSerializer.ReadObject(memoryStre) as List<Obj_ImageValidation>;
memoryStre.Close();
memoryStre.Flush();
memoryStre.Dispose();
AddTxtLog("对解压后的每张图片进行MD5校验");
//对解压后的每张图片进行MD5校验
string MD5Code = "";
string PicfolderName = absolutePath.Substring(0, absolutePath.LastIndexOf('.')); //图片存放的文件夹名称
foreach (Obj_ImageValidation iv in MD5check)
{
if (File.Exists(PicfolderName + "\\" + iv.fileName))
{
MD5Code = GetFileMD5(PicfolderName + "\\" + iv.fileName);
if (MD5Code.ToUpper() != iv.CheckCode.ToUpper())
{
result = "图片(" + PicfolderName + "\\" + iv.fileName + ")上传不完整!传过来的MD5校验码:" + iv.CheckCode + ",服务器生成的校验码:" + MD5Code + "。";
ExceptionHandler.HandleWebException(logger, "406", result, Context, username);
Context.Response.Write(JsonHelper.ToJson(result));
AddTxtLog(result);
return;
}
}
else
{
result = "在对每张图片做MD5校验时发现,根据从APP传过来的图片名称(" + iv.fileName + ")找不到文件!";
AddTxtLog(result);
Context.Response.Write(JsonHelper.ToJson(result));
return;
}
}
#endregion
}
else
{
result = "压缩包文件(" + absolutePath + ")不存在!";
AddTxtLog(result);
Context.Response.Write(JsonHelper.ToJson(result));
return;
}
}
当代码执行到“MD5Code = GetFileMD5(PicfolderName + "\" + iv.fileName);”这一句的时候会报错,我觉得是我的程序对文件流没控制好,还望大神们指教。谢谢!
GetFileMD5 怎么定义的
#region MD5文件校验
/// <summary>
/// MD5文件校验
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string GetFileMD5(string path)
{
string ret = "";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] md5byte = md5.ComputeHash(fs);
int i, j;
foreach (byte b in md5byte)
{
i = Convert.ToInt32(b);
j = i >> 4;
ret += Convert.ToString(j, 16);
j = ((i << 4) & 0x00ff) >> 4;
ret += Convert.ToString(j, 16);
}
fs.Flush();
fs.Close();
fs.Dispose();
return ret;
}
#endregion
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
将这句替换成:
using( FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
}
你是不是用到多线程了?如果是,请处理好多线程同步问题。