Azure 存储的断点续传与 MD5 校验-ESG跨境

Azure 存储的断点续传与 MD5 校验

来源网络
来源网络
2022-07-05
点赞icon 0
查看icon 868

Azure 存储的断点续传与 MD5 校验Azure 存储的断点续传与 MD5 校验问题分析首先关于 Azure 存储中 MD5 的描述,我们已经有相关的介绍文档,如果对于存储中 MD5 的描述不熟悉,可以先参考 Azure Blob 存储基于 MD5 的完整性检查的内容。如果直接将文件上传到 Blob 中可以在上传的......

Azure 存储的断点续传与 MD5 校验




Azure 存储的断点续传与 MD5 校验

问题分析

首先关于 Azure 存储中 MD5 的描述,我们已经有相关的介绍文档,如果对于存储中 MD5 的描述不熟悉,可以先参考 Azure Blob 存储基于 MD5 的完整性检查的内容。

如果直接将文件上传到 Blob 中可以在上传的方法中配置 BlobRequestOptions 类,将该类的 StoreBlobContentMD5 参数设置为 true,即可在上传时自动计算 MD5 值并将此值写入到请求头部(ContentMD5)中(可以参考 BlobRequestOptions.StoreBlobContentMD5 Property 此文档的描述)。 但是如果使用断点续传的方法,是将文件分为多个块上传,之后通过 PubBlockList 请求完成组合,那么想要上传 MD5 值,需要在 PubBlockList 请求的头部添加 xmsblobcontentmd5 参数,但是在 sdk 相关的方法中,BlobRequestOptions 中并没有关于该参数的属性,所以如果使用断点续传,采用 sdk 的 PubBlockList() 方法无法将 MD5 值上传上去,本篇文档即要解决如何在断点续传时上传 MD5 值的问题。

解决方案

可以通过使用 REST API 的方式来解决此问题:

1.首先我们需要计算出文件的 MD5 值:

string contentHash = md5()(File.ReadAllBytes(sourcePath));

2.将文件分块上传:

public async Task PutBlobAsync(String containerName, String blobName, byte[] blobContent, String blobid, bool error = false)

{

  String requestMethod = PUT;

  String urlPath = String.Format({0}/{1}, containerName, blobName) +  comp=blockblockid= + blobid;

  String storageServiceVersion = 20150221;

  String dateInRfc1123Format = DateTime.UtcNow.ToString(R, CultureInfo.InvariantCulture);

  Int32 blobLength = blobContent.Length;

  //headers

  String canonicalizedHeaders = String.Format(

    \nxmsdate:{0}\nxmsversion:{1},

    dateInRfc1123Format,

    storageServiceVersion);

  //resources

  String canonicalizedResource = String.Format(/{0}/{1}, AzureConstants.Account, String.Format({0}/{1}, containerName, blobName) + \nblockid: + blobid + \ncomp:block);

  String stringToSign = String.Format(

  {0}\n\n\n{1}\n\n\n\n\n\n\n\n{2}\n{3},

  requestMethod,

  blobLength,

  canonicalizedHeaders,

  canonicalizedResource);

  string authorizationHeader = CreateAuthorizationHeader(stringToSign);

  //上传url

  Uri uri = new Uri(BlobEndPoint + urlPath);

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

  request.Method = requestMethod;

  request.Headers[xmsdate] = dateInRfc1123Format;

  request.Headers[xmsversion] = storageServiceVersion;

  request.Headers[Authorization] = authorizationHeader;

  request.ContentLength = blobLength;

  try {

    using (Stream requestStream = await request.GetRequestStreamAsync()) {

      requestStream.Write(blobContent, 0, blobLength);

    }

    using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) {

      String ETag = response.Headers[ETag];

      System.Console.WriteLine(ETag);

    }

    error = false;

  }

  catch (WebException ex) {

    System.Console.WriteLine(An error occured. Status code: + ((HttpWebResponse)ex.Response).StatusCode);

    System.Console.WriteLine(Error information:);

    error = true;

    using (Stream stream = ex.Response.GetResponseStream()) {

      using (StreamReader sr = new StreamReader(stream)) {

        var s = sr.ReadToEnd();

        System.Console.WriteLine(s);

      }

    }

  }

}

3.在 PutBlobListAsync() 方法中将 MD5 值和 xmsblobcontentmd5 写入到请求头中:

public async Task PutBlobListAsync(String containerName, String blobName, Liststring blobIdList, string md5, bool error = false)

{

  String requestMethod = PUT;

  String urlPath = String.Format({0}/{1}, containerName, blobName) + ?comp=blocklist;

  String storageServiceVersion = 20150221;

  String dateInRfc1123Format = DateTime.UtcNow.ToString(R, CultureInfo.InvariantCulture);

  String canonicalizedHeaders = String.Format(

    \nxmsblobcontentmd5:{0}\nxmsdate:{1}\nxmsversion:{2},

    md5,

    dateInRfc1123Format,

    storageServiceVersion);

  StringBuilder stringbuilder = new StringBuilder();

  stringbuilder.Append(BlockList);

  foreach (string item in blobIdList) {

    stringbuilder.Append( Latest + item + /Latest);

  }

  stringbuilder.Append(/BlockList);

  byte[] data = Encoding.UTF8.GetBytes(stringbuilder.ToString());

  Int32 blobLength = data.Length;

  String canonicalizedResource = String.Format(/{0}/{1}, AzureConstants.Account, String.Format({0}/{1}, containerName, blobName) + \ncomp:blocklist);

  String stringToSign = String.Format(

    {0}\n\n\n{1}\n\n\n\n\n\n\n\n{2}\n{3},

    requestMethod,

    blobLength,

    canonicalizedHeaders,

    canonicalizedResource);

  String authorizationHeader = CreateAuthorizationHeader(stringToSign);

  Uri uri = new Uri(BlobEndPoint + urlPath);

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

  request.Method = requestMethod;

  request.Headers[xmsblobcontentmd5] = md5;

  request.Headers[xmsdate] = dateInRfc1123Format;

  request.Headers[xmsversion] = storageServiceVersion;

  request.Headers[Authorization] = authorizationHeader;

  request.ContentLength = blobLength;

  try {

    using (Stream requestStream = await request.GetRequestStreamAsync()) {

      requestStream.Write(data, 0, blobLength);

    }

    using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) {

      String ETag = response.Headers[ETag];

      System.Console.WriteLine(ETag);

    }

    error = false;

  }

  catch (WebException ex) {

    System.Console.WriteLine(An error occured. Status code: + ((HttpWebResponse)ex.Response).StatusCode);

    System.Console.WriteLine(Error information:);

    error = true;

    using (Stream stream = ex.Response.GetResponseStream()) {

      using (StreamReader sr = new StreamReader(stream)) {

        var s = sr.ReadToEnd();

        System.Console.WriteLine(s);

      }

    }

  }

}

完整示例请参考示例代码。


文章推荐
AppGallery Connect Server常见问题解答,huawei appgallery
Google play该怎么上传马甲包,google play服务停止运行怎么解决
Google Ads推广状态受限怎么办,google ads怎么解封
Google AdMob 2021年推出新广告形式激励插页式广告单元,如何提高google广告投放


特别声明:以上文章内容仅代表作者本人观点,不代表ESG跨境电商观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与ESG跨境电商联系。

搜索 放大镜
韩国平台交流群
加入
韩国平台交流群
扫码进群
欧洲多平台交流群
加入
欧洲多平台交流群
扫码进群
美国卖家交流群
加入
美国卖家交流群
扫码进群
ESG跨境专属福利分享群
加入
ESG跨境专属福利分享群
扫码进群
拉美电商交流群
加入
拉美电商交流群
扫码进群
亚马逊跨境增长交流群
加入
亚马逊跨境增长交流群
扫码进群
亚马逊跨境增长交流群
加入
亚马逊跨境增长交流群
扫码进群
拉美电商交流群
加入
拉美电商交流群
扫码进群
ESG独家招商-PHH GROUP卖家交流群
加入
ESG独家招商-PHH GROUP卖家交流群
扫码进群
《韩国平台运营干货包》
《波兰allegro知识百科》
《Darty知识百科》
《法国Fnac知识百科》
《PEAKS 出海经营方法论白皮书》
2025跨境电商营销日历
《2024年全球消费趋势白皮书——美国篇》
《2024TikTok出海达人营销白皮书》
《Coupang自注册指南》
《eMAG知识百科》
通过ESG入驻平台,您将解锁
绿色通道,更高的入驻成功率
专业1v1客户经理服务
运营实操指导
运营提效资源福利
平台官方专属优惠

立即登记,定期获得更多资讯

订阅
联系顾问

平台顾问

平台顾问 平台顾问

微信扫一扫
马上联系在线顾问

icon icon

小程序

微信小程序

ESG跨境小程序
手机入驻更便捷

icon icon

返回顶部

【免费领取】全球跨境电商运营干货 关闭
进行中
进行中
《韩国平台运营干货包》
包含四个韩国干货报告:Coupang自注册指南、GMK站内推广指南、韩国大促热销品详细预测、韩国节日营销全攻略
免费领取
进行中
进行中
TikTok运营必备干货包
包含8个TikTok最新运营指南(市场趋势、运营手册、节日攻略等),官方出品,专业全面!
免费领取
进行中
进行中
韩国电商节日营销指南
10+韩国电商重要营销节点详细解读;全年度各节日热度选品助力引爆订单增长;8大节日营销技巧轻松撬动大促流量密码。
免费领取
进行中
进行中
【平台干货】eMAG知识百科
涵盖从开店到大卖6个板块:开店、运营、广告、选品、上架、物流
免费领取
进行中
进行中
全球平台详解——全球合集
涵括全球100+个电商平台的核心信息,包括平台精炼简介、竞争优势、热销品类、入驻要求以及入驻须知等关键内容。
立即领取
进行中
进行中
韩国coupang平台自注册指南
韩国Coupang电商平台从注册准备、提交申请到完成注册,开店全流程详细指引。
免费领取
进行中
进行中
2025跨境电商营销日历
包括传统中、外重要节日及重点电商营销节点还对营销关键市场、选品辅以说明,让你的365天安排的明明白白!
免费领取
进行中
进行中
全球平台详解——欧洲篇
涵盖20+欧洲电商平台,详细解读优势、入驻条件、热销品等
立即领取
进行中
进行中
【Fnac Darty直播】夏促爆单指南
1.夏季法国本土消费趋势解析;2.促销旺季来临,选品、备货、活动等筹备指南;3.案例: 单月狂揽66万欧,中国卖家如何把握平台红利
立即报名