【问题标题】:Upload and retrieve images from azure blobs using .net core Web API and jquery使用 .net 核心 Web API 和 jquery 从 azure blob 上传和检索图像
【发布时间】:2019-12-25 01:21:09
【问题描述】:

我正在尝试创建一个博客,您可以在其中发布图片。基本上我想做的是从本地机器中选择图像,然后单击按钮以使用 post 方法将其发送到 azure blob,然后使用 get 方法检索并在网页上显示图像。 我找到了这个 Microsoft 文档:
https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet
但我不知道如何将其应用于 get 和 post 方法。 我也试过这个:

static void Main(string[] args)
{
string connStr = "your_connection_string_here";

CloudStorageAccount account = CloudStorageAccount.Parse(connStr);

CloudBlobClient client = account.CreateCloudBlobClient();

CloudBlobContainer container = client.
GetContainerReference("myblobcontainer");

container.CreateIfNotExists();

CloudBlockBlob blob = container.
GetBlockBlobReference("myblob");


blob.UploadFromFile(@"C:\Test\Image1.jpg");

}

但是我不知道如何将它应用到 web api。

我有很多疑问,例如:
1. get 和 post 方法应该是什么?
2. jquery的get请求和post请求如何处理客户端的图片?
3. 通过 put 和 get 请求(可能是 JSON)以什么方式发送图像?
4. 如何将图片添加到 img 标签中?
5.如何识别哪个图片属于哪个帖子

非常感谢您的帮助。如果我问的内容不相关或愚蠢,请提前道歉。我还是个学生。

注意:我使用的是 .net core 2.1

【问题讨论】:

  • 这里有documentation,您可以使用 Javascript 调用 Azure API。如果您有任何问题,我建议您遵循这些并提出更具体的问题:-)
  • @SimplyGed 感谢您的回复。我浏览了您链接的文档,但是我需要从服务器端处理上传和检索。
  • 嗨@DuskHare,怎么样?你的问题解决了吗?

标签: jquery azure-blob-storage .net-core-2.1 webapi


【解决方案1】:

我将 Html 页面用作客户端,将 .net 核心 API 用作后端。试试下面的代码:

1.客户端HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <title> 
        Async file upload with jQuery 
    </title> 

    <script src= 
"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"> 
    </script> 
</head> 

<body> 
    <div align="center"> 
        <form method="post" action="" enctype="multipart/form-data"
                id="myform"> 

            <div > 
                <input type="file" id="file" name="file" /> 
                <input type="button" class="button" value="Upload"
                        id="but_upload"> 
            </div> 
        </form> 

        </br>

        <div>
            <input type="button" id="but_display" value ="show all uploaded images">

            <div id="stage"></dev>

        </dev>
    </div>   

    <script type="text/javascript"> 
        $(document).ready(function() { 
            $("#but_upload").click(function() { 
                var fd = new FormData(); 
                var files = $('#file')[0].files[0]; 
                fd.append('file', files); 

                $.ajax({ 
                    url: 'https://localhost:44348/api/blob/', 
                    type: 'post', 
                    data: fd, 
                    contentType: false, 
                    processData: false, 
                    success: function(response){ 
                        if(response != 0){ 
                        alert('file uploaded'); 
                        } 
                        else{ 
                            alert('file not uploaded'); 
                        } 
                    }, 
                }); 
            });

            $("#but_display").click(function() { 
                $.ajax({ 
                    url: 'https://localhost:44348/api/blob/', 
                    type: 'get', 
                    success: function(response){ 
                        $("#stage").empty();
                        response.forEach((url)=>{

                            $("#stage").append("<img src='" + url +"' width='200' >");

                        })
                    }
                });

            });
        }); 
    </script> 
</body> 

</html> 

2.backend .net核心API:

1)。创建一个新的 .net core API 项目。 2)。转到Startup.csConfigureServices方法,粘贴下面的代码替换它:

    services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    }));
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    services.AddSingleton<CloudBlobClient>(sp => { return CloudStorageAccount.Parse("<your storage account connection string>").CreateCloudBlobClient(); });

转到Configure 方法。在下面添加一行代码:

app.UseCors("MyPolicy");

3)。进入Controller文件夹,创建一个控制器BlobController.cs,代码如下:

using System;
using System.Collections;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Storage.Blob;

// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace blobApitest
{

    [Route("api/[controller]")]
    [EnableCors("MyPolicy")]
    public class BlobController : Controller
    {

        private CloudBlobClient cloudBlobClient;


        public BlobController(CloudBlobClient cloudBlobClient)
        {
            this.cloudBlobClient = cloudBlobClient;

        }

        [HttpPost()]
        public OkObjectResult upload([FromForm] IFormFile file)
        {

           string FileName = file.FileName;
           var container = cloudBlobClient.GetContainerReference("<your container name>");
           var blob = container.GetBlockBlobReference(FileName);

           blob.UploadFromStream(file.OpenReadStream());

           return Ok("uploaded");
        }

        [HttpGet()]

        public OkObjectResult GetAll() {

            var bloblist = new ArrayList();

            var container = cloudBlobClient.GetContainerReference("<your container name>");
            SharedAccessBlobPolicy ReadOnly = new SharedAccessBlobPolicy()
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
                Permissions = SharedAccessBlobPermissions.Read
            };

            var sas = container.GetSharedAccessSignature(ReadOnly);

            foreach (var blob in container.ListBlobs()) {
                bloblist.Add(blob.Uri+sas);
            }
            return Ok(bloblist);
        }

    }  
}

4) .运行这个项目。

测试结果:

如果您成功将 imgae 上传到存储,您将收到警报:

让我们检查容器,图像已成功上传:

单击显示所有图像按钮,将显示容器中的所有图像:

希望对您有所帮助。

【讨论】:

  • 在 blob 控制器中,ListBlobs() 中的每个循环都有一个错误。它说 CloudBlobContainer 不包含 ListBlobs 的定义。当我将其更改为 ListBlobsSegmentedAsync 时,会出现错误,因为每个语句都不能对 Task 类型的变量进行操作,因为 Task 不包含 GetEnumerator 的公共实例定义。没有重载方法 ListBlobsSegmentedAsync 需要 0 个参数
  • 嗨,@DuskHare 这个错误可能是因为涉及到一些无用的包。我已经更新了我的代码。 ListBlobs() 方法属于 Microsoft.Azure.Storage.Blob 的 CloudBlobContainer 类。在我的代码中,它的版本是 11.1.1 最新版本,请在 NuGet 中检查一下。如果我的回答有帮助,请单击答案旁边的复选标记,将其从灰色切换为已填充以将其标记为答案,我很高兴回答您的进一步问题。
  • 嗨@DuskHare,更重要的是,也许这个文档会帮助你解决这个问题:docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-list
  • 嗨@StanleyGong,抱歉回复晚了。当我调用 api 时,出现以下异常:“InvalidOperationException:尝试激活 'API.Controllers.BlobController' 时无法解析类型 'Microsoft.Azure.Storage.Blob.CloudBlobClient' 的服务。”我认为您必须通过授权标头。我该怎么办。
  • 当我从 mvc 调用 api 时,我得到 500 内部错误以及来自我的原始 mvc 的 cors not enabled 错误
猜你喜欢
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2019-12-20
  • 2018-10-12
相关资源
最近更新 更多