internal async Task HttpPostS3Async(string filepath, Signature signature) { FileInfo file = new FileInfo(filepath); if (file.Exists == false) { throw new VzaarApiException ("File does not exsist: "+filepath); } string hostname = (string)signature ["upload_hostname"]; //move signature to Dictionary Dictionary<string, string> postFields = new Dictionary<string, string>(); postFields.Add ("x-amz-credential", (string)signature["x-amz-credential"]); postFields.Add ("x-amz-algorithm", (string)signature["x-amz-algorithm"]); postFields.Add ("x-amz-date", (string)signature["x-amz-date"]); postFields.Add ("x-amz-signature", (string)signature["x-amz-signature"]); postFields.Add ("x-amz-meta-uploader", Client.UPLOADER + Client.VERSION); postFields.Add ("acl",(string)signature["acl"]); postFields.Add ("bucket",(string)signature["bucket"]); postFields.Add ("policy",(string)signature["policy"]); postFields.Add ("success_action_status",(string)signature["success_action_status"]); string key = (string)signature["key"]; string fileKey = ""; if(String.IsNullOrEmpty(key) == false) fileKey = key.Replace ("${filename}", file.Name); postFields.Add ("key",fileKey); long? parts = signature ["parts"] as long?; if (parts == null) { //upload file in POST form FileStream fileStream; using(fileStream = new FileStream (filepath, FileMode.Open, FileAccess.Read)) { await HttpPostMfdcAsync (hostname, file.Name, postFields, fileStream); // response is validated in the HttpPostMfdcAsync } } else { string keyCache = postFields["key"]; long chunk = 0; if (signature ["part_size_in_bytes"] == null) throw new VzaarApiException ("File Upload: not valid 'part_size_in_bytes'"); int chunkSize = Convert.ToInt32((long)signature ["part_size_in_bytes"]); byte[] buffer = new byte[chunkSize]; int bytesCount; FileStream fileStream; using (fileStream = new FileStream (filepath, FileMode.Open, FileAccess.Read)) { while ((bytesCount = await fileStream.ReadAsync(buffer,0,chunkSize)) != 0 ) { string chunkKey = keyCache + "." + chunk.ToString (); postFields.Remove ("key"); postFields.Add ("key", chunkKey); MemoryStream chunkStream; using (chunkStream = new MemoryStream (buffer,0,bytesCount)) { await HttpPostMfdcAsync (hostname, file.Name, postFields, chunkStream); // response is validated in the HttpPostMfdcAsync } VideoUploadProgressEventArgs progress = new VideoUploadProgressEventArgs () { totalParts = (long)parts, uploadedChunk = chunk }; UploadProgress (this, progress); chunk++; } } } }