将 HttpContent 转换为 byte[]

Posted

技术标签:

【中文标题】将 HttpContent 转换为 byte[]【英文标题】:Convert HttpContent into byte[] 【发布时间】:2015-09-17 18:45:31 【问题描述】:

我目前正在开发 C# Web API。对于特定调用,我需要使用 ajax 调用向 API 发送 2 张图像,以便 API 可以将它们保存为数据库中的 varbinary(max)。

    如何从HttpContent 对象中提取Imagebyte[]? 如何执行两次?每张图片一次。

-

var authToken = $("#AuthToken").val();
var formData = new FormData($('form')[0]);
debugger;
$.ajax(
    url: "/api/obj/Create/", 
    headers:  "Authorization-Token": authToken ,
    type: 'POST',
    xhr: function ()  
        var myXhr = $.ajaxSettings.xhr();
        return myXhr;
    ,
    data: formData,
    cache: false,
    contentType: false,
    processData: false
);

-

public async Task<int> Create(HttpContent content)

    if (!content.IsMimeMultipartContent())
    
        throw new UnsupportedMediaTypeException("MIME Multipart Content is not supported");
    

    return 3;

【问题讨论】:

【参考方案1】:

HttpContent 有一个返回 ByteArray 的 Async 方法,即(ByteArray 的任务)

 Byte[] byteArray = await Content.ReadAsByteArrayAsync();

可以同步运行方法

Byte[] byteArray = Content.ReadAsByteArrayAsync().Result;

【讨论】:

这会返回一个不错的长字节[],但我需要提取两个单独的图像 很好的答案,但几乎总是避免使用.Result,因为它会导致线程锁定。 @VSO 为什么?为什么会导致线程锁?【参考方案2】:
if (!content.IsMimeMultipartContent())

    throw new UnsupportedMediaTypeException("MIME Multipart Content is not supported");


var uploadPath = **whatever**;
if (!Directory.Exists(uploadPath))

    Directory.CreateDirectory(uploadPath);


var provider = new MultipartFormDataStreamProvider(uploadPath);
await content.ReadAsMultipartAsync(provider);

return File.ReadAllBytes(provider.FileData[0].LocalFileName);

【讨论】:

【参考方案3】:

你可以使用HttpContent.ReadAsByteArrayAsync:

byte[] bytes = await response.Content.ReadAsByteArrayAsync();

或者,您可以使用HttpContent.ReadAsStreamAsync 阅读内容并从那里提取到byte[]

var stream = await response.Content.ReadAsStreamAsync();
using (var memoryStream = new MemoryStream())

      await stream.CopyToAsync(memoryStream);
      return memoryStream.ToArray();

【讨论】:

@James 你使用的是哪个 .NET 版本? 尝试清理和重建。 这并没有改变什么 见this 我无法解决它......但无论如何,这并不能解决我需要提取两个图像或两个单独的字节 [] 的问题。跨度> 【参考方案4】:

请查看 ByteArrayContent 类公开的 CopyToAsync(Stream, TransportContext) 方法。 [msdn link]

【讨论】:

我正在寻找一个更详细的答案,也许是一个例子

以上是关于将 HttpContent 转换为 byte[]的主要内容,如果未能解决你的问题,请参考以下文章

使用 StreamReader 读取 HttpContent 流直到字符限制

使用GSON在字符串和byte []之间转换JSON

UnsupportedOperationException 将 byte[] 转换为 float[]

在C#中如何将byte[] 类型转换为图片类型

将 ArrayList<Byte> 转换为 byte[] [重复]

将 BYTE* 转换为 Array<byte>^