Skip to content

Instantly share code, notes, and snippets.

@tanglebones
Last active December 17, 2015 04:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tanglebones/5550036 to your computer and use it in GitHub Desktop.
Save tanglebones/5550036 to your computer and use it in GitHub Desktop.
Sending a file to S3
private static byte[] GetMultipartFormData(
IDictionary<string, string> parameters,
string caName,
byte[] fileContents,
string boundary)
{
var formDataStream = new MemoryStream();
byte[] formData;
using(formDataStream)
{
var head = Encoding.UTF8.GetBytes(
string.Join(
string.Empty,
parameters.Select(
x =>
string.Format(
"--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n",
boundary,
x.Key,
x.Value
)
)
)
+ string.Format(
"--{0}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"{1}\";\r\nContent-Type: {2}\r\nContent-Length: {3}\r\n\r\n",
boundary,
caName,
parameters["Content-Type"],
fileContents.Length
)
);
formDataStream.Write(head, 0, head.Length);
formDataStream.Write(fileContents, 0, fileContents.Length);
var foot = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
formDataStream.Write(foot, 0, foot.Length);
formDataStream.Position = 0;
formData = new byte[formDataStream.Length];
formDataStream.Read(formData, 0, formData.Length);
}
return formData;
}
private static async Task<bool> S3Upload(object s3UploadInfo, byte[] contents)
{
try
{
var resp = (JObject) s3UploadInfo;
var s3PostUrl = resp.SelectToken("s3post_url", true).ToString();
var caName = resp.SelectToken("caName", true).ToString();
var formParameters = new Dictionary<string, string>();
foreach (
var key in
new[]
{
"key",
"policy",
"signature",
"AWSAccessKeyId",
"acl",
"Content-Type"
})
formParameters[key] = resp.SelectToken(key, true).ToString();
var boundary = string.Format("----------{0:N}", Guid.NewGuid());
var formData = GetMultipartFormData(formParameters, caName, contents, boundary);
File.WriteAllBytes("formdata.bin", formData);
var request = (HttpWebRequest) WebRequest.Create(s3PostUrl);
request.ContentLength = formData.Length;
request.UserAgent = "move_s3test_client";
request.AuthenticationLevel = AuthenticationLevel.None;
request.Method = "POST";
request.CookieContainer = new CookieContainer();
request.ContentType = "multipart/form-data; boundary=" + boundary;
using (var requestStream = request.GetRequestStream())
{
await requestStream.WriteAsync(formData, 0, formData.Length);
requestStream.Close();
}
var response = (HttpWebResponse) await request.GetResponseAsync();
return response.StatusCode==HttpStatusCode.NoContent;
}
catch (WebException ex)
{
// TODO: Handle web exception
return false;
}
catch
{
// TODO: handle general exception
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment