Загрузка файла в BLOB-объект Azure в сетевом ядре с помощью элемента управления Telerik - PullRequest
0 голосов
/ 14 июня 2019

Проект с использованием .net core 2.2 с использованием элементов управления Telerik, пытающихся загрузить файл в BLOB-объект Azure.

У меня есть контроллер, который ожидает, что представленная модель будет иметь IEnumerable IFormFile.

Когда я пытаюсь прочитать файл, он думает, что файл существует в каталоге, в котором находится веб-приложение. Я знаю, что проблема в том, что я использую 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);
       }
   }
}

У меня есть вспомогательный класс, где я делаю все свои загрузки в BLOB-объект Azure. Работает, подпись метода:

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 голосов
/ 17 июня 2019

Как только у вас будет готово хранилище BLOB-объектов для ваших файлов, нам потребуется предоставить нашему приложению метод сохранения файлов.Поскольку это приложение будет использовать элемент управления Telerik с представлениями MVC для клиентской части приложения, нам потребуется конечная точка 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 будет обрабатывать запрос SafeFile в конечной точке api / FileUpload / SaveFile.Принимая параметр 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 в базе данных, чтобы его можно было использовать позже в пользовательском интерфейсе нашего приложения.

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

Надеемся, что он разрешит ваш запрос.

Подробнее ссылка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...