I'm trying to upload an image to Imgur's api https://api.imgur.com/3/upload but return status: 400, Bad request BadReqImg.
I'm convinced the issue is coming from file uploading part, as below, but couldn't find any problem with it.
if (files != null)
{
foreach (string key in files.Keys)
{
string filePath = @"C:\Image\" + files[key];
if (File.Exists(filePath))
{
int bytesRead = 0;
byte[] buffer = new byte[2048];
byte[] formItemBytes = System.Text.Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n", key, files[key]));
memStream.Write(boundarybytes, 0, boundarybytes.Length);
memStream.Write(formItemBytes, 0, formItemBytes.Length);
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
// Write file content to stream, byte by byte
memStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
}
}
}
}
Here's the entire code
string Url = "https://api.imgur.com/3/upload";
string retString = string.Empty;
NameValueCollection values = new NameValueCollection();
NameValueCollection files = new NameValueCollection();
values.Add("name", "testpic");
files.Add("image", file);
try
{
string boundary = "-------------------------" + DateTime.Now.Ticks.ToString("x");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.ContentType = "multipart/form-data; boundary=" +
boundary;
request.Method = "POST";
Stream memStream = new System.IO.MemoryStream();
var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--");
#region 2
foreach (string key in values.Keys)
{
// Write item to stream
byte[] formItemBytes = System.Text.Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", key, values[key]));
memStream.Write(boundarybytes, 0, boundarybytes.Length);
memStream.Write(formItemBytes, 0, formItemBytes.Length);
}
if (files != null)
{
foreach (string key in files.Keys)
{
string filePath = @"C:\Image\" + files[key];
if (File.Exists(filePath))
{
int bytesRead = 0;
byte[] buffer = new byte[2048];
byte[] formItemBytes = System.Text.Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n", key, files[key]));
memStream.Write(boundarybytes, 0, boundarybytes.Length);
memStream.Write(formItemBytes, 0, formItemBytes.Length);
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
// Write file content to stream, byte by byte
memStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
}
}
}
}
#endregion
memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
request.ContentLength = memStream.Length;
using (Stream requestStream = request.GetRequestStream())
{
memStream.Position = 0;
byte[] tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer, 0, tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer, 0, tempBuffer.Length);
}
using (var response = request.GetResponse())
{
Stream stream2 = response.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);
retString = reader2.ReadToEnd();
}
}
catch (Exception ex)
{
}
return retString;