使用Telerik控件将文件上传到Net Core中的Azure Blob

时间:2019-06-14 18:25:02

标签: azure asp.net-core telerik

使用.net core 2.2的项目,并使用Telerik控件尝试将文件上传到Azure blob。

我有一个控制器,它希望提交的模型具有IFormFile的IEnumerable。

当我尝试读取文件时,它认为该文件存在于Web应用程序所在的目录中。我知道问题出在我正在使用System.IO.Path。*,但不确定使用什么。

我的视图包含此控件:

@(Html.Kendo().Upload()
    .Name("files")
    .HtmlAttributes(new { aria_label = "files" })
    .Validation(validation => validation.AllowedExtensions(new string[] { ".gif", ".jpg", ".png" }))

我的控制器方法签名:

[CustomAuthorization]
[HttpPost]
[Route("/Content/AddFile")]
public async Task<IActionResult> AddFile(ViewModels.Content.ContentViewModel model)
{

}

和相关代码:

foreach (var formFile in model.files)
{
   if (formFile.Length > 0)
   {
       using (var stream = new FileStream(filePath, FileMode.Create)) // what is this FileMode.Create doing?
       {
           // I'm stuck here, where is this created?
           await formFile.CopyToAsync(stream);
       }
   }
}

我有一个帮助器类,在其中我将所有上载到Azure blob。它有效,方法签名为:

public async Task<bool> SaveContent(string contentName, string contentType, Stream fileContents)

但是我不确定如何获取文件流,也不确定FileMode.Create部分正在做什么。在SaveContent内部是创建文件的地方。

简而言之,我正在使用Telerik文件控件,并试图将所选文件的内容放入流中。

我以此为参考:https://www.telerik.com/forums/file-upload-full-example-with-server-side-code

1 个答案:

答案 0 :(得分:0)

一旦您为文件准备好Blob存储,我们将需要为我们的应用程序提供一种保存文件的方法。由于此应用程序将在该应用程序的客户端使用带有MVC视图的Telerik控件,因此我们需要一个WebAPI端点供客户端进行通信。让我们创建一个控制器和控制器操作来处理文件请求。

假设下面是控制器:

//FileUploadController.cs

[Route("api/[controller]")]

public class FileUploadController : Controller
{
    [HttpPost("[Action]")]
    async public Task<IActionResult> SaveFile(IFormFile files)
    {
        // Connect to Azure

        // Save file to blob

        // Respond with success
    }
}

FileUploadController将在端点api / FileUpload / SaveFile处处理SafeFile请求。通过接受IFormFile的参数,我们将能够绑定来自请求主体的传入文件值。发出请求后,下面的HTTP请求就是ASP.NET的文件请求。

Entity
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary*

Body
Content-Disposition: form-data; name="files"; filename="some-file.jpg"
Content-Type: image/jpeg

Next we'll connect to our Azure storage account and make a reference to the "photos" container we designated earlier as our storage for user photos. To work with Azure in .NET we'll add the WindowsAzure.Storage NuGet package. Once this package is installed we can make a reference to Microsoft.WindowsAzure.Storage and Microsoft.WindowsAzure.Storage.Blob giving us access to the Azure storage APIs.

// Connect to Azure

// Set the connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

// Create a blob client. 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Get a reference to a container  
CloudBlobContainer container = blobClient.GetContainerReference("photos");

With the file and Azure container ready, we can save the file. We'll need a BlockBlobReference, this will create a new reference in Azure or allow us to overwrite an existing file. Next, we'll open a file stream and upload the file asnychronously to Azure.

// Save file to blob

// Get a reference to a blob  
CloudBlockBlob blockBlob = container.GetBlockBlobReference(files.FileName);

// Create or overwrite the blob with the contents of a local file 
using (var fileStream = files.OpenReadStream())
{
    await blockBlob.UploadFromStreamAsync(fileStream);
}

文件上传到Azure后,我们可以使用成功响应来响应HTTP请求。在响应中,我们将包括保存的文件名,文件大小,最重要的是可以在存储中找到该文件的URI。根据功能在应用程序中的使用方式,我们可能希望将此URI保存到数据库中,以便以后可以在应用程序的UI中使用。

// Respond with success
return Json(new {
    name = blockBlob.Name,
    uri = blockBlob.Uri,
    size = blockBlob.Properties.Length
});

希望它可以解决您的查询。

进一步reference