Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过RESTAPI.net以二进制形式返回图像(而不是url)_C#_.net_Asp.net Web Api_Asp.net Web Api2_Azure Storage Blobs - Fatal编程技术网

C# 如何通过RESTAPI.net以二进制形式返回图像(而不是url)

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();

好的,我有一个webapi,它可以获取/添加/更新/删除客户,后端是CosmosDB

用户可以为每个客户上载图像,该文件存储在Azure Blob存储中,但文件名存储在CosmosDB属性中

[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图像元素中<代码>