Skip to content

Instantly share code, notes, and snippets.

@ChiiAyano
Created December 28, 2013 04:47
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 ChiiAyano/8156202 to your computer and use it in GitHub Desktop.
Save ChiiAyano/8156202 to your computer and use it in GitHub Desktop.
protected async Task<IEnumerable<byte>> CreateMultipartFormData(IDictionary<string, object> parameter, string boundary)
{
var dataBytes = new List<byte>();
foreach (var p in parameter)
{
dataBytes.AddRange(Encoding.UTF8.GetBytes("--" + boundary + "\r\n"));
if (p.Value is Stream)
{
var sendData = await Task.Factory.StartNew<byte[]>(() =>
{
var ms = p.Value as MemoryStream;
// ストリームをバイト配列にする
ms.Seek(0, SeekOrigin.Begin);
var send = new List<byte>();
while (true)
{
var rb = new byte[1024];
var readBytes = ms.Read(rb, 0, rb.Length);
if (readBytes <= 0)
break;
send.AddRange(rb);
}
return send.ToArray();
});
var data = string.Format(
"Content-Disposition: form-data; name=\"{0}\"; filename=\"upload_{1}.jpg\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"Content-Transfer-Encoding: binary\r\n\r\n", p.Key, boundary);
dataBytes.AddRange(Encoding.UTF8.GetBytes(data));
dataBytes.AddRange(sendData);
dataBytes.AddRange(Encoding.UTF8.GetBytes("\r\n"));
}
else if (p.Value is string)
{
var data = string.Format(
"Content-Disposition: form-data; name=\"{0}\"\r\n\r\n" +
"{1}\r\n", p.Key, (p.Value as string).UrlEncode());
dataBytes.AddRange(Encoding.UTF8.GetBytes(data));
}
else
{
var data = string.Format(
"Content-Disposition: form-data; name=\"{0}\"\r\n\r\n" +
"{1}\r\n", p.Key, p.Value);
dataBytes.AddRange(Encoding.UTF8.GetBytes(data));
}
}
dataBytes.AddRange(Encoding.UTF8.GetBytes("--" + boundary + "--"));
return dataBytes;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment