将 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
对象中提取Image
或byte[]
?
如何执行两次?每张图片一次。
-
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 流直到字符限制
UnsupportedOperationException 将 byte[] 转换为 float[]