Как загрузить файл в хранилище BLOB-объектов Azure из представления MVC

Я кодирую интернет-приложение MVC5 и хотел бы помочь загрузить файл из моей собственной файловой системы в большой двоичный объект Azure.

Вот моя функция кода загрузки 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? Могу ли я помочь с этим?

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


person user3736648    schedule 17.09.2014    source источник


Ответы (1)


Один из способов вызвать функцию UploadTestFile() из представления MVC — использовать метод 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(): похоже, что код попытается загрузить localFileName из файловой системы виртуальной машины, а не данных формы, состоящей из нескольких частей. Одним из подходов может быть использование класса 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);
    }
    

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

person Perry Skountrianos - MSFT    schedule 19.09.2014