【问题标题】:Upload image to web API using C#使用 C# 将图像上传到 Web API
【发布时间】:2015-11-24 12:02:47
【问题描述】:

我正在尝试通过 POST 将图像上传到网络服务。

API 文档说“通过 POST 上传文件,编码为“multipart/form-data”,并在图像数据中包含一个名为“image”的 POST arg。图像必须是 PNG、JPG 或GIF。"

这是我的代码:

Bitmap    myImage = new Bitmap("myImage.jpg");
byte[] myFileData = (byte[])(new ImageConverter()).ConvertTo(myImage, typeof(byte[]));
string myBoundary = "------------------------" + DateTime.Now.Ticks;
var       newLine = Environment.NewLine;
string myContent = 
  "--" + myBoundary + newLine + 
  "content-disposition: form-data; name=\"image\"; filename=\"myImage.jpg\"" + newLine + 
  "Content-Type: image/jpeg" + newLine +
  "Content-Transfer-Encoding: binary" + newLine +
  newLine +
  Encoding.Default.GetString(myFileData) + newLine + 
  "--" + myBoundary + "--";

try {
    using (var httpClient = new HttpClient()) 
    using (var content = new StringContent(myContent, Encoding.Default, "multipart/form-data, boundary=" + myBoundary)) 
    using (var response = await httpClient.PostAsync("http://my_API_URL", content)) {
        string responseData = await response.Content.ReadAsStringAsync();
    }
}
catch (Exception myExp) { }

此代码在尝试创建 StringContent 对象时引发异常。

我可以接受任何建议。我需要使用的 API 需要身份验证,通常使用 WebClient 和以下语句来解决:

client.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("my_API_key:"));

我可以使用任何其他形式的 POST,例如 WebClient 或 HttpClient。

【问题讨论】:

  • 您实际上并不需要将图像加载到 Bitmap 实例中(至少在不需要客户端图像转换的情况下)。对我来说,直接通过 WebClient.UploadFile 上传图像效果很好。见msdn.microsoft.com/de-de/library/36s52zhs(v=vs.110).aspx
  • 不幸的是,我需要使用的 API 明确表示不这样做,而是必须将其编码为“multipart/form-data”并包含一个名为“image”的 POST arg。

标签: c# web-services api http-post image-uploading


【解决方案1】:

最终奏效的代码,以防万一有人在寻找相同的答案:

Bitmap    myImage = new Bitmap("myImage.jpg");
byte[] myFileData = (byte[])(new ImageConverter()).ConvertTo(myImage, typeof(byte[]));
string myBoundary = "---------------------------7df3c13714f0ffc";
var       newLine = Environment.NewLine;
string  myContent =
  "--" + myBoundary + newLine + 
  "Content-Disposition: form-data; name=\"image\"; filename=\"myImage.jpg\"" + newLine +
  "Content-Type: image/jpeg" + newLine +
  newLine +
  Encoding.Default.GetString(myFileData) + newLine +
  "--" + myBoundary + "--";

using (var client = new WebClient()) {
    try {
        client.Headers["Authorization"] = "Basic xxxxxx";
        client.Headers["Content-Type"]  = "multipart/form-data; boundary=" + myBoundary;
        client.UploadString(new Uri(myURL), "POST", myContent);
        totalAPICalls++;
    }
    catch { }
}

【讨论】:

    猜你喜欢
    • 2018-07-22
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2018-01-06
    • 2011-01-03
    • 2011-05-20
    相关资源
    最近更新 更多