/// <summary> /// Upload data to Amazon S3 using HTTP POST. /// </summary> /// <remarks> /// For more information, <see href="http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html"/> /// </remarks> /// <param name="request">Request object which describes the data to POST</param> /// <exception cref="S3PostUploadException">Thrown if the service returns an error</exception> public static S3PostUploadResponse PostUpload(S3PostUploadRequest request) { string url; string subdomain = request.Region.Equals(RegionEndpoint.USEast1) ? "s3" : "s3-" + request.Region.SystemName; if (request.Bucket.IndexOf('.') > -1) { url = string.Format(CultureInfo.InvariantCulture, "https://{0}.amazonaws.com/{1}/", subdomain, request.Bucket); } else { url = string.Format(CultureInfo.InvariantCulture, "https://{0}.{1}.amazonaws.com", request.Bucket, subdomain); } Uri uri = new Uri(url); HttpWebRequest webRequest = WebRequest.Create(uri) as HttpWebRequest; var boundary = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace('=', 'z'); webRequest.ContentType = string.Format(CultureInfo.InvariantCulture, "multipart/form-data; boundary={0}", boundary); webRequest.Method = "POST"; using (var reqStream = webRequest.GetRequestStream()) { request.WriteFormData(boundary, reqStream); byte[] boundaryBytes = Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "--{0}\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n", boundary)); reqStream.Write(boundaryBytes, 0, boundaryBytes.Length); using (var inputStream = null == request.Path ? request.InputStream : File.OpenRead(request.Path)) { byte[] buf = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.Read(buf, 0, 1024)) > 0) { reqStream.Write(buf, 0, bytesRead); } } byte[] endBoundaryBytes = Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "\r\n--{0}--", boundary)); reqStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); } HttpWebResponse response = null; try { response = webRequest.GetResponse() as HttpWebResponse; } catch (WebException ex) { throw S3PostUploadException.FromResponse((HttpWebResponse)ex.Response); } return(S3PostUploadResponse.FromWebResponse(response)); }
/// <summary> /// Upload data to Amazon S3 using HTTP POST. /// </summary> /// <remarks> /// For more information, <see href="http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html"/> /// </remarks> /// <param name="request">Request object which describes the data to POST</param> /// <exception cref="S3PostUploadException">Thrown if the service returns an error</exception> public static S3PostUploadResponse PostUpload(S3PostUploadRequest request) { string url; if (request.Bucket.IndexOf('.') > -1) url = String.Format("https://s3.amazonaws.com/{0}/", request.Bucket); else url = String.Format("https://{0}.s3.amazonaws.com", request.Bucket); HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest; var boundary = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace('=','z'); webRequest.ContentType = String.Format("multipart/form-data; boundary={0}", boundary); webRequest.Method = "POST"; using (var reqStream = webRequest.GetRequestStream()) { request.WriteFormData(boundary, reqStream); byte[] boundaryBytes = Encoding.UTF8.GetBytes(String.Format("--{0}\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n", boundary)); reqStream.Write(boundaryBytes, 0, boundaryBytes.Length); using (var inputStream = null == request.Path ? request.InputStream : File.OpenRead(request.Path)) { byte[] buf = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.Read(buf, 0, 1024)) > 0) { reqStream.Write(buf, 0, bytesRead); } } byte[] endBoundaryBytes = Encoding.UTF8.GetBytes(String.Format("\r\n--{0}--", boundary)); reqStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); } HttpWebResponse response = null; try { response = webRequest.GetResponse() as HttpWebResponse; } catch (WebException ex) { throw S3PostUploadException.FromResponse((HttpWebResponse)ex.Response); } return S3PostUploadResponse.FromWebResponse(response); }