【问题标题】:How to use webapi for uploading and downloading any files from Azure Blob Storage?如何使用 webapi 从 Azure Blob 存储上传和下载任何文件?
【发布时间】:2021-02-03 14:54:37
【问题描述】:

所以我正在处理 ASP.NET 中的 webapi,要求是接受来自基于 React 构建的 webapp 的图像(通常是文件),并根据请求返回文件。正在使用的存储服务是 Azure Blob 存储。 我是这个环境的新手,我发现是关于如何通过控制台或直接应用程序而不是通过 api 上传文件的教程。我需要知道通过 react 应用发送什么,以便我的 webapi 可以接受并将其上传到 Blob 存储,以及通过我的 api 发送什么到 webapp,并附上示例代码。

【问题讨论】:

  • 能否详细描述您的问题?您想知道如何在 React 应用中直接将文件上传到 azure blob 吗?
  • 不,实际上我正在 ASP.NET 中构建一个 api,我想制作一个用于上传和下载文件的 api,该文件将由基于 react 的 webapp 使用。我发现的一种解决方案是获取图像的字节字符串并将其直接存储到 Blob 存储中,但在这种情况下,我需要将图像转换为 react 本身,然后将其发送到我的 api。我想知道更好的方法。
  • 请检查我的回答
  • 谢谢,该代码适用于 api。而且它还使用 Azure 命名空间 nuget 包,而不是已弃用的包。不过只有一个问题,我尝试使用 react 进行测试,它给了我“net::err_cert_authority_invalid react”错误,因为 axios 仅适用于 https,我猜。而且我没有找到任何好的资源来解决这个问题。但是当使用 Postman 进行测试时,该代码可以工作。你也可以提供下载部分吗?再次感谢,提前。

标签: azure api asp.net-core asp.net-web-api azure-blob-storage


【解决方案1】:

关于这个问题,您可以将图像文件作为表单数据发送到您的 API。更多详情请参考以下步骤

  • 客户
import logo from "./logo.svg";
import "./App.css";
import React, { useState } from "react";
import axios from "axios";

function App() {
  const [selectedFile, setSelectedFile] = useState();
  const [isFilePicked, setIsFilePicked] = useState(false);

  const changeHandler = (event) => {
    setSelectedFile(event.target.files[0]);
    setIsFilePicked(true);
  };

  const onFileUpload = async () => {
    const formData = new FormData();
    formData.append("file", selectedFile);
    formData.append("fileName", selectedFile.name);
    try {
      const res = await axios.post(
        "https://localhost:44349/weatherforecast",
        formData
      );
      console.log(res);
    } catch (error) {
      console.log(error);
    }
  };

  return (
    <div>
      <input type="file" name="file" onChange={changeHandler} />
      {isFilePicked ? (
        <div>
          <p>Filename: {selectedFile.name}</p>
          <p>Filetype: {selectedFile.type}</p>
          <p>Size in bytes: {selectedFile.size}</p>
        </div>
      ) : (
        <p>Select a file to show details</p>
      )}
      <div>
        <button onClick={onFileUpload}>Upload</button>
      </div>
    </div>
  );
}

export default App;

  • 服务器
  1. Configure CORS
public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
            {
                options.AddDefaultPolicy(
                    builder => builder.AllowAnyOrigin()
                        .AllowAnyHeader()
                        .AllowAnyMethod());
            });
            services.AddControllers();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseCors();
            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
  1. API
[Consumes("multipart/form-data")]
        [HttpPost]
        public async Task<IActionResult> OnPostUploadAsync([FromForm] FileModel model)
        {
            try {

                string connectionString = "";
                BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
                var sourceContainer = blobServiceClient.GetBlobContainerClient("output");
                var blob = sourceContainer.GetBlockBlobClient(model.file.FileName);

                await blob.UploadAsync(model.file.OpenReadStream(), new BlobUploadOptions()
                {
                    HttpHeaders = new BlobHttpHeaders() { 
                      ContentType= model.file.ContentType
                    }
                });
                // Process uploaded files
                // Don't rely on or trust the FileName property without validation.

                return StatusCode(StatusCodes.Status201Created); ;

            } catch (Exception) {
                return StatusCode(StatusCodes.Status500InternalServerError);
            }
           
        }

【讨论】:

    【解决方案2】:

    您需要将 Azure Storage NuGet 包添加到您的项目中,然后使用包中的内置类将文件上传到 Azure Blob 存储。

    您可以在相同的here 和here 上找到一个基础

    【讨论】:

    • 链接中使用的 nuget 包已弃用。安装包时,它实际上破坏了我在项目中的其他引用,所以我不得不卸载它。
    • 好的,这些可能已被弃用。您可以在安装软件包时选择最新的稳定版本吗?该 NuGet 包的最新稳定版本不应破坏您的项目文件
    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 2018-01-08
    • 2015-06-20
    • 2021-01-15
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多