C# 如何通过RESTAPI.net以二进制形式返回图像(而不是url)
好的,我有一个webapi,它可以获取/添加/更新/删除客户,后端是CosmosDB 用户可以为每个客户上载图像,该文件存储在Azure Blob存储中,但文件名存储在CosmosDB属性中C# 如何通过RESTAPI.net以二进制形式返回图像(而不是url),c#,.net,asp.net-web-api,asp.net-web-api2,azure-storage-blobs,C#,.net,Asp.net Web Api,Asp.net Web Api2,Azure Storage Blobs,好的,我有一个webapi,它可以获取/添加/更新/删除客户,后端是CosmosDB 用户可以为每个客户上载图像,该文件存储在Azure Blob存储中,但文件名存储在CosmosDB属性中 [HttpPost] public async Task<IHttpActionResult> Adduser([FromBody]User user) { var telemetry = new TelemetryClient();
[HttpPost]
public async Task<IHttpActionResult> Adduser([FromBody]User user)
{
var telemetry = new TelemetryClient();
try
{
var userStore = CosmosStoreHolder.Instance.CosmosStoreUser;
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//Then we validate the content type
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
#region File upload
//Initalize configuration settings
var accountName = ConfigurationManager.AppSettings["storage:account:name"];
var accountKey = ConfigurationManager.AppSettings["storage:account:key"];
var profilepicturecontainername = ConfigurationManager.AppSettings["storage:account:profilepicscontainername"];
//Instance objects needed to store the files
var storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer imagesContainer = blobClient.GetContainerReference(profilepicturecontainername);
var provider = new AzureStorageMultipartFormDataStreamProvider(imagesContainer);
// Validate extension and image size
foreach (MultipartFileData file in provider.FileData)
{
var fileName = file.Headers.ContentDisposition.FileName.Trim('\"').Trim();
if (fileName.EndsWith(".png"))
{
var img = Image.FromFile(file.LocalFileName);
if (img.Width != 200 && img.Height != 200)
{
string guid = Guid.NewGuid().ToString();
return BadRequest($"Error Lulo. Unsupported extension, only PNG is valid. Or unsuported image dimensions (200px x 200px)");
}
}
}
//Try to upload file
try
{
await Request.Content.ReadAsMultipartAsync(provider);
}
catch (Exception ex)
{
string guid = Guid.NewGuid().ToString();
var dt = new Dictionary<string, string>
{
{ "Error Lulo: ", guid }
};
telemetry.TrackException(ex, dt);
return BadRequest($"Error Lulo. An error has occured. Details: {guid} {ex.Message}: ");
}
// Retrieve the filename of the file you have uploaded
var filename = provider.FileData.FirstOrDefault()?.LocalFileName;
if (string.IsNullOrEmpty(filename))
{
string guid = Guid.NewGuid().ToString();
var dt = new Dictionary<string, string>
{
{ "Error Lulo: ", guid }
};
return BadRequest($"Error Lulo. An error has occured while uploading your file. Please try again.: {guid} ");
}
//Rename file
CloudBlockBlob blobCopy = imagesContainer.GetBlockBlobReference(user.Id + ".png");
if (!await blobCopy.ExistsAsync())
{
CloudBlockBlob blob = imagesContainer.GetBlockBlobReference(filename);
if (await blob.ExistsAsync())
{
await blobCopy.StartCopyAsync(blob);
await blob.DeleteIfExistsAsync();
}
}
#endregion
if (string.IsNullOrEmpty(user.CustomerId) && string.IsNullOrEmpty(user.PartnerId))
{
return BadRequest("ClientID or PartnerId must be filled in.");
}
var added = await userStore.AddAsync(user);
return Ok(added);
}
catch (Exception ex)
{
string guid = Guid.NewGuid().ToString();
var dt = new Dictionary<string, string>
{
{ "Error Lulo: ", guid }
};
telemetry.TrackException(ex, dt);
return BadRequest("Error Lulo: " + guid);
}
}
您可以考虑使用以下方法将图像转换为Base64字符串:
,您可以考虑使用以下方法将图像转换为Base64字符串: < P>我假设您要将图片嵌入到元素中? 你为什么不使用Base64呢?然后您可以返回如下内容:data:image/[png/jpg,取决于图像类型];base64,[此处的base64图像值]
我假设您希望将图片嵌入元素中?
你为什么不使用Base64呢?然后您可以返回如下内容:
data:image/[png/jpg,取决于图像类型];base64,[此处的base64图像值]
在Web API中返回文件的最佳方法是将其加载到内存中,然后通过file方法返回:
[HttpGet]
public IActionResult Get()
{
Byte[] b = ...; // Load blob from storage to byte array, usually via a MemoryStream.
return File(b, "image/jpeg");
}
File方法实际上是返回FileContentReult或FileStreamResult的助手,您可以在此处了解更多信息:
如果使用以流为参数的文件方法重载之一,甚至可以避免在内存中缓冲整个blob。在Web API中返回文件的最佳方法是将其加载到内存,然后通过文件方法返回:
[HttpGet]
public IActionResult Get()
{
Byte[] b = ...; // Load blob from storage to byte array, usually via a MemoryStream.
return File(b, "image/jpeg");
}
File方法实际上是返回FileContentReult或FileStreamResult的助手,您可以在此处了解更多信息:
如果使用一个以流为参数的文件方法重载,甚至可以避免在内存中缓冲整个blob。如果图像没有固定的公共url,则需要将其编码为base64,并将其作为内联图像嵌入 如果可以从Web API后端访问POCO中的url,则可以使用以下代码检索和转换图像:
private static HttpClient _HttpClient=new HttpClient();
公共异步任务GetInlineImageSrcAsync(字符串url)
{
var bytes=wait_httpClient.GetByteArrayAsync(url);
var base64=Convert.tobase64字符串(字节);
var mimeType=“image/png”;
//如果mime类型不同,请尝试以下方法
//var mimeType=$“image/{ParseExtensionFromUrl(url)}”
var inlineImageSrc=$“数据:{mimeType};base64,{base64}”;
返回inlineImageSrc;
}
公共字符串ParseExtensionFromUrl(字符串url)
{
返回url.Substring(url.LastIndexOf(“.”+1);
}
请注意,HttpClient应该是静态的,以使其能够重用连接。这是Microsoft推荐的,可以提高性能。
有关这方面的更多信息:
编辑:
这是实际嵌入图像的HTML:
“/>
如果图像没有固定的公共url,则需要将其编码为base64并作为内联图像嵌入
如果可以从Web API后端访问POCO中的url,则可以使用以下代码检索和转换图像:
private static HttpClient _HttpClient=new HttpClient();
公共异步任务GetInlineImageSrcAsync(字符串url)
{
var bytes=wait_httpClient.GetByteArrayAsync(url);
var base64=Convert.tobase64字符串(字节);
var mimeType=“image/png”;
//如果mime类型不同,请尝试以下方法
//var mimeType=$“image/{ParseExtensionFromUrl(url)}”
var inlineImageSrc=$“数据:{mimeType};base64,{base64}”;
返回inlineImageSrc;
}
公共字符串ParseExtensionFromUrl(字符串url)
{
返回url.Substring(url.LastIndexOf(“.”+1);
}
请注意,HttpClient应该是静态的,以使其能够重用连接。这是Microsoft建议的,可以提高性能。
有关这方面的更多信息:
编辑:
这是实际嵌入图像的HTML:
“/>
这是我在以前的一个项目中如何做到的。我有一个方法,它获取图片的Url路径、名称和扩展名。该方法将图像转换为base64字符串
public string ConvertToBase64(string path)
{
byte[] b = System.IO.File.ReadAllBytes(path);
var base64img = "data:image/jpg;base64," + Convert.ToBase64String(b);
Return base64img;
}
像这样使用它
var imgUrl = AzureImgUrlPath + "imageName.jpg";
var imageBase64String = ConvertToBase64(imgUrl);
这就是我在以前的一个项目中所做的。我有一个方法,它获取图片的Url路径、名称和扩展名。该方法将图像转换为base64字符串
public string ConvertToBase64(string path)
{
byte[] b = System.IO.File.ReadAllBytes(path);
var base64img = "data:image/jpg;base64," + Convert.ToBase64String(b);
Return base64img;
}
像这样使用它
var imgUrl = AzureImgUrlPath + "imageName.jpg";
var imageBase64String = ConvertToBase64(imgUrl);
感兴趣的,你能给我看更多的代码吗?@LuisValencia我已经用html代码编辑了我的答案以嵌入图像。下面有一条评论(来自M.Kirsche),显示了你需要的代码,使用http客户端。我唯一能对他的响应做出贡献的是,然后获取“inlineImageSrc”值并将其嵌入到html图像元素中
有兴趣的话,你能给我看更多的代码吗?@LuisValencia我已经用html代码编辑了我的答案以嵌入图像。下面有一条评论(来自M.Kirsche),显示了你需要的代码,使用http客户端。我唯一能对他的响应做出贡献的是,然后获取“inlineImageSrc”值并将其嵌入到html图像元素中<代码>