簡體   English   中英

.NET HttpClient 圖像上傳到 PlantNet API

[英].NET HttpClient Image Upload to PlantNet API

我正在嘗試通過 .NET HttpClient 向 PlantNet API 發出請求。 我有一個 FileStream,我正在使用 StreamContent,當我在發送之前通過調試器查看內容時,它看起來不錯。 但是 PlantNet 響應是Unsupported file type for image[0] (jpeg or png) 我嘗試了我想到的一切,來自 VS Code Rest Client 的相同請求正在工作(使用相同的文件),如果 StreamContent 以某種方式與文件數據混淆,是否有人有任何想法?

HttpResponseMessage responseMessage;
using (MultipartFormDataContent content = new("abcdef1234567890")) //Fixed boundary for debugging
{
  content.Add(new StringContent("flower"), "organs");

  using Stream memStream = new MemoryStream();
  await stream.CopyToAsync(memStream, cancellationToken);
  StreamContent fileContent = new(memStream);
  fileContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");

  content.Add(fileContent, "images", fileName);

  responseMessage = await _httpClient.PostAsync(url, content, cancellationToken);
}

注意: stream是文件的流,在這種情況下,它來自使用IFormFile.OpenReadStream()的 ASP.NET Core API 控制器,但我也嘗試通過直接打開文件

new FileStream("path", FileMode.Open, FileAccess.Read)

在調試器content.ReadAsStringAsync()解析為以下

--abcdef1234567890
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=organs

flower
--abcdef1234567890
Content-Type: image/jpeg
Content-Disposition: form-data; name=images; filename=test-flower.jpeg; filename*=utf-8''test-flower.jpeg


--abcdef1234567890--

這對我來說看起來非常好,所以我的猜測是,文件二進制數據可能以某種方式在內容或其他內容中損壞? 當我將上述內容用於具有相同文件的 VS Code 休息客戶端時,它可以工作,並且我從 PlantNet API 獲得了成功的響應。

(背景:我在 Fedora Linux 上使用 .NET 6)

好的,我通過將副本刪除到內存流來解決它。 這是需要的,因為一開始我直接打開文件進行調試,如果我不這樣做,則會收到異常。 對我有用的代碼是

HttpResponseMessage responseMessage;
using (MultipartFormDataContent content = new("abcdef1234567890"))
{
  content.Add(new StringContent("flower"), "organs");

  StreamContent fileContent = new(stream);
  fileContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
  fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
  {
    FileName = fileName,
    Name = "images"
  };

  content.Add(fileContent, "images", fileName);

  responseMessage = await _httpClient.PostAsync(url, content, cancellationToken);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM