private string FinishMultipartUpload(string accessKey, string secretKey, Uri requestUri, string uploadId, Dictionary <int, string> partNumberETags, DateTime expiryDate) { var timeSpan = new TimeSpan(expiryDate.Ticks - _jan1St1970Ticks); long expiry = Convert.ToInt64(timeSpan.TotalSeconds); var finishOrCancelMultipartUploadUri = new Uri(string.Format("{0}?uploadId={1}", requestUri.AbsoluteUri, uploadId)); string signatureForFinishMultipartUpload = SignatureHelper.CreateSignature(secretKey, SignatureHelper.CreateStringToSign(finishOrCancelMultipartUploadUri, "POST", string.Empty, "text/plain", expiry, null)); var finishMultipartUploadUrl = new Uri(string.Format("{0}?uploadId={1}&AWSAccessKeyId={2}&Signature={3}&Expires={4}", requestUri.AbsoluteUri, HttpUtility.UrlEncode(uploadId), accessKey, HttpUtility.UrlEncode(signatureForFinishMultipartUpload), expiry)); var payload = new StringBuilder(); payload.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?><CompleteMultipartUpload>"); foreach (var item in partNumberETags) { payload.AppendFormat("<Part><PartNumber>{0}</PartNumber><ETag>{1}</ETag></Part>", item.Key, item.Value); } payload.Append("</CompleteMultipartUpload>"); var requestPayload = Encoding.UTF8.GetBytes(payload.ToString()); var request = (HttpWebRequest)WebRequest.Create(finishMultipartUploadUrl); request.Method = "POST"; request.ContentType = "text/plain"; request.ContentLength = requestPayload.Length; using (var stream = request.GetRequestStream()) { stream.Write(requestPayload, 0, requestPayload.Length); } using (var resp = (HttpWebResponse)request.GetResponse()) { } string signatureForGet = SignatureHelper.CreateSignature(secretKey, SignatureHelper.CreateStringToSign(new Uri(requestUri.AbsoluteUri), "GET", string.Empty, string.Empty, expiry, null)); string signedGetUrl = string.Format("{0}?AWSAccessKeyId={1}&Signature={2}&Expires={3}", requestUri.AbsoluteUri, accessKey, HttpUtility.UrlEncode(signatureForGet), expiry); return(signedGetUrl); }
private Dictionary <int, string> UploadParts(string accessKey, string secretKey, Uri requestUri, string uploadId, string filePath, DateTime expiryDate, Action <int, int> callbackForPartDone = null) { var partNumberETags = new Dictionary <int, string>(); var timeSpan = new TimeSpan(expiryDate.Ticks - _jan1St1970Ticks); long expiry = Convert.ToInt64(timeSpan.TotalSeconds); var fileContents = File.ReadAllBytes(filePath); int partNumber = 1; int startPosition = 0; int bytesToBeUploaded = fileContents.Length; do { int bytesToUpload = Math.Min(FiveMegaBytes, bytesToBeUploaded); if (callbackForPartDone != null) { callbackForPartDone(partNumber, bytesToBeUploaded); } var partUploadUrl = new Uri(string.Format("{0}?uploadId={1}&partNumber={2}", requestUri.AbsoluteUri, HttpUtility.UrlEncode(uploadId), partNumber)); string partUploadSignature = SignatureHelper.CreateSignature(secretKey, SignatureHelper.CreateStringToSign(partUploadUrl, "PUT", string.Empty, string.Empty, expiry, null)); var partUploadPreSignedUrl = new Uri(string.Format("{0}?uploadId={1}&partNumber={2}&AWSAccessKeyId={3}&Signature={4}&Expires={5}", requestUri.AbsoluteUri, HttpUtility.UrlEncode(uploadId), partNumber, accessKey, HttpUtility.UrlEncode(partUploadSignature), expiry)); var request = (HttpWebRequest)WebRequest.Create(partUploadPreSignedUrl); request.Method = "PUT"; request.Timeout = 1000 * 600; request.ContentLength = bytesToUpload; using (var stream = request.GetRequestStream()) { stream.Write(fileContents, startPosition, bytesToUpload); } using (var resp = (HttpWebResponse)request.GetResponse()) { using (var streamReader = new StreamReader(resp.GetResponseStream())) { partNumberETags.Add(partNumber, resp.Headers["ETag"]); } } bytesToBeUploaded = bytesToBeUploaded - bytesToUpload; startPosition = bytesToUpload; partNumber = partNumber + 1; }while (bytesToBeUploaded > 0); return(partNumberETags); }