5

Я кодирую интернет-приложение MVC5 и хотел бы помочь загрузить файл из моей собственной файловой системы в Azure Blob.Как загрузить файл в хранилище Azure blob из MVC-представления

Вот мой Azure код загрузки функции:

public void UploadFileToBlobStorage(string containerName, string blockBlogName, string fileName) 
{ 
    // Retrieve storage account from connection string. 
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
     CloudConfigurationManager.GetSetting("StorageConnectionString")); 

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

    // Retrieve reference to a previously created container. 
    CloudBlobContainer container = blobClient.GetContainerReference(containerName); 

    // Create the container if it doesn't already exist. 
    container.CreateIfNotExists(); 

    container.SetPermissions(
     new BlobContainerPermissions 
     { 
      PublicAccess = 
       BlobContainerPublicAccessType.Blob 
     }); 

    // Retrieve reference to a blob named "myblob". 
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blockBlogName); 

    // Create or overwrite the "myblob" blob with contents from a local file. 
    using (var fileStream = System.IO.File.OpenRead(fileName)) 
    { 
     blockBlob.UploadFromStream(fileStream); 
    } 
} 

Вот моя функция, чтобы загрузить тестовый файл:

public void UploadTestFile(string localFileName) 
{ 
    string containerName = "TestContainer"; 
    string blockBlogName = "Test.txt"; 
    AzureService azureService = new AzureService(); 
    azureService.UploadFileToBlobStorage(containerName, blockBlogName, localFileName); 
} 

Я не знаю, как вызвать функцию UploadTestFile() из MVC Просмотр, где пользователь может перейти к загружаемому файлу.

Нужно ли использовать Ajax, или я могу просто загрузить файл, вызвав метод из представления MVC? Могу ли я, пожалуйста, помочь с этим?

Заранее спасибо

ответ

9

Один из способов для вызова функции UploadTestFile() из MVC View является использование() метод Html.BeginForm. Я включаю пример ниже:

@using (Html.BeginForm("UploadTestFile", "INSERT_YOUR_CONTROLLER_NAME_HERE", FormMethod.Post, new { enctype = "multipart/form-data" })) { 
    <span> 
     <input type="file" name="myFile" multiple /> <br> 
     <input type="submit" value="Upload" /> 
    </span> 

} 

Кроме того, несколько предложений по вашему коду:

  1. UploadFileToBlobStorage(): проверяет код для контейнера существования и настройки разрешения на каждом запросе. Я бы порекомендовал разделить логику container.CreateIfNotExists() и container.SetPermissions (...) в отдельную функцию инициализации, которая должна выполняться только один раз при первом развертывании.

  2. UploadFileToBlobStorage(): Похоже, что код попытается загрузить локальное имя_файла из файловой системы VM, а не данные формы с несколькими частями. Один из подходов - использовать класс HttpFileCollectionBase и свойство Controller.Request. Пример ниже:

    public void UploadFileToBlobStorage(string containerName, string blockBlogName, HttpFileCollectionBase files) { 
        // ..... 
    
        // Use this: 
        blockBlob.UploadFromStream(files[0].InputStream); // uploading the first file: you can enumerate thru the files collection if you are uploading multiple files 
    
        // Instead of this: Create or overwrite the "myblob" blob with contents from a local file. 
        using (var fileStream = System.IO.File.OpenRead(fileName)) { 
         blockBlob.UploadFromStream(fileStream); 
        } 
    } 
    
    [HttpPost] 
    public void UploadTestFile() { 
        string containerName = "TestContainer"; 
        string blockBlogName = "Test.txt"; 
        AzureService azureService = new AzureService(); 
    
        // Notice the Request.Files instead of localFileName 
        azureService.UploadFileToBlobStorage(containerName, blockBlogName, Request.Files); 
    } 
    

Пожалуйста, дайте мне знать, если это работает на вашем конце.

Смежные вопросы