Azure 存储文件的 MD5 校验和与本地文件(同一个文件)不同
Azure stored file has different MD5 checksum than local file (being same file)
我正在使用 could 服务将文件上传到 Azure 存储服务,因此我想使用 MD5 校验和检查文件的完整性,所以我首先从一个函数中获取校验和。
public static string GetMD5HashFromFile(Stream stream)
{
using (var md5 = MD5.Create())
{
return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", string.Empty);
}
}
对于我正在使用的测试文件,我得到:1dffc245282f4e0a45a9584fe90f12f2 并且当我使用像 this.
这样的在线工具时,我得到了相同的结果
然后我将文件上传到 Azure 并从我的代码中获取它,如下所示:(为了避免包含验证,我们假设文件和目录确实存在。)
public bool CompareCheckSum(string fileName, string checksum)
{
this.storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("MyConnectionString"));
this.fileClient = this.storageAccount.CreateCloudFileClient();
this.shareReference = this.fileClient.GetShareReference(CloudStorageFileShareSettings.StorageFileShareName);
this.rootDir = this.shareReference.GetRootDirectoryReference();
this.directoryReference = this.rootDir.GetDirectoryReference("MyDirectory");
this.fileReference = this.directoryReference.GetFileReference(fileName);
Stream stream = new MemoryStream();
this.fileReference.DownloadToStream(stream);
string azureFileCheckSum = GetMD5HashFromFile(stream);
return azureFileCheckSum.ToLower() == checksum.ToLower();
}
我还尝试使用如下不同的过程获取校验和:
public bool CompareCheckSum(string fileName, string checksum)
{
this.storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("MyConnectionString"));
this.fileClient = this.storageAccount.CreateCloudFileClient();
this.shareReference = this.fileClient.GetShareReference(CloudStorageFileShareSettings.StorageFileShareName);
this.rootDir = this.shareReference.GetRootDirectoryReference();
this.directoryReference =
this.rootDir.GetDirectoryReference("MyDirectory");
this.fileReference = this.directoryReference.GetFileReference(fileName);
this.fileReference.FetchAttributes();
string azureFileCheckSum = this.fileReference.Metadata["md5B64"];
return azureFileCheckSum.ToLower() == checksum.ToLower();
}
最后,对于 azureFileCheckSum,我得到:d41d8cd98f00b204e9800998ecf8427e 不确定我是否做错了什么或者当我将文件上传到 ftp...
在调用 md5.ComputeHash(stream)
之前,您需要将流的位置重置为开头。
stream.Position = 0;
当然,如果流类型不支持搜索,这将失败并显示 NotSupportedException
,但在您的情况下它应该可以工作。
我正在使用 could 服务将文件上传到 Azure 存储服务,因此我想使用 MD5 校验和检查文件的完整性,所以我首先从一个函数中获取校验和。
public static string GetMD5HashFromFile(Stream stream)
{
using (var md5 = MD5.Create())
{
return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", string.Empty);
}
}
对于我正在使用的测试文件,我得到:1dffc245282f4e0a45a9584fe90f12f2 并且当我使用像 this.
这样的在线工具时,我得到了相同的结果然后我将文件上传到 Azure 并从我的代码中获取它,如下所示:(为了避免包含验证,我们假设文件和目录确实存在。)
public bool CompareCheckSum(string fileName, string checksum)
{
this.storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("MyConnectionString"));
this.fileClient = this.storageAccount.CreateCloudFileClient();
this.shareReference = this.fileClient.GetShareReference(CloudStorageFileShareSettings.StorageFileShareName);
this.rootDir = this.shareReference.GetRootDirectoryReference();
this.directoryReference = this.rootDir.GetDirectoryReference("MyDirectory");
this.fileReference = this.directoryReference.GetFileReference(fileName);
Stream stream = new MemoryStream();
this.fileReference.DownloadToStream(stream);
string azureFileCheckSum = GetMD5HashFromFile(stream);
return azureFileCheckSum.ToLower() == checksum.ToLower();
}
我还尝试使用如下不同的过程获取校验和:
public bool CompareCheckSum(string fileName, string checksum)
{
this.storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("MyConnectionString"));
this.fileClient = this.storageAccount.CreateCloudFileClient();
this.shareReference = this.fileClient.GetShareReference(CloudStorageFileShareSettings.StorageFileShareName);
this.rootDir = this.shareReference.GetRootDirectoryReference();
this.directoryReference =
this.rootDir.GetDirectoryReference("MyDirectory");
this.fileReference = this.directoryReference.GetFileReference(fileName);
this.fileReference.FetchAttributes();
string azureFileCheckSum = this.fileReference.Metadata["md5B64"];
return azureFileCheckSum.ToLower() == checksum.ToLower();
}
最后,对于 azureFileCheckSum,我得到:d41d8cd98f00b204e9800998ecf8427e 不确定我是否做错了什么或者当我将文件上传到 ftp...
在调用 md5.ComputeHash(stream)
之前,您需要将流的位置重置为开头。
stream.Position = 0;
当然,如果流类型不支持搜索,这将失败并显示 NotSupportedException
,但在您的情况下它应该可以工作。