2017-01-25 1 views
0

Я пытаюсь создать простой вид для загрузки файла в лазурный контейнер для хранения. После загрузки я хочу поймать BlockBlobReference для загруженного файла, сохранить ссылку в поле базы данных, чтобы загрузить файл для последующего использования. Я понял вид и контроллер для загрузки (работы по загрузке), но я понятия не имею, как справиться с остальными.Как поймать ссылку azure blob при загрузке

Вот часть моей точки зрения бритвы:

<div> 
    @using (Html.BeginForm("UploadTestFile", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { 
    <span>Select File:</span> 
    <input type="file" name="loadedFiles" multiple /> 
    <hr /> 
    <input type="submit" value="Upload" /> 
    <br /> 
    <span style="color:green">@ViewBag.Message</span> 
    } 
</div> 

И это контроллер и метод:

[HttpPost] 
    public void UploadTestFile(HttpPostedFileBase loadedFiles) 
    { 
     string containerName = "testcontainer"; 
     UploadFileToBlobStorage(containerName, loadedFiles); 
    } 

    public void UploadFileToBlobStorage(string containerName, HttpPostedFileBase loadedFiles) 
    { 
     // 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 
      }); 

// here I would like to iterate through the items, in case that more than one file was selected 
// I don't know how to iterate through loadedFiles though 


    // filename 
     string _fileName = loadedFiles.FileName; 


     // Retrieve reference to a blob 
     CloudBlockBlob blockBlob = container.GetBlockBlobReference(_fileName); 

      blockBlob.UploadFromStream(loadedFiles.InputStream); 
    } 

Может кто-нибудь мне помочь или дать мне несколько советов, пожалуйста. С уважением, Manu

+1

Почему вы хотите сохранить BlobReference? Вы всегда можете скачать файл только с именем и именем контейнера. –

+0

@Matias: Спасибо за подсказку. Я не знал, что достаточно только контейнера и имени файла. – Manu

ответ

1

Вы можете безопасно хранить только имя файла (и имя контейнера в случае его изменения) или URL-адрес (в зависимости от того, является ли контейнер общедоступным или нет).

Если контейнер является общедоступным, вы можете просто использовать blob-url: https://{yourstorageaccount}.blob.core.windows.net/{container}/{filename.extension}.

Если его частный, вы можете сохранить имя файла и прочитать файл, как это:

public byte[] ReadFile(string containerName, string fileName) 
{ 
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    var container = blobClient.GetContainerReference(containerName); 
    var fileBase = container.GetBlockBlobReference(fileName); 
    if (!fileBase.Exists()) 
    { 
     return null; 
    } 
    fileBase.FetchAttributes(); 
    var fileByteLength = fileBase.Properties.Length; 
    var fileByteArray = new Byte[fileByteLength]; 

    fileBase.DownloadToByteArray(fileByteArray, 0); 
    return fileByteArray; 
} 

Или как это, если вы хотите, чтобы содержимое в виде строки:

public string ReadFileAsString(string containerName, string fileName) 
{ 
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    var container = blobClient.GetContainerReference(containerName); 
    var fileBase = container.GetBlockBlobReference(fileName); 
    if (!fileBase.Exists()) 
    { 
     return null; 
    } 
    return fileBase.DownloadText(Encoding.UTF8, AccessCondition.GenerateEmptyCondition(), null, null); 
} 

Если вы хотите вызвать загрузку с действия MVC, вы можете сделать что-то вроде:

public ActionResult GetFile(string fileName) 
{ 
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    var container = blobClient.GetContainerReference("myContainer"); 
    var fileBase = container.GetBlockBlobReference(fileName); 
    if (!fileBase.Exists()) 
    { 
     return null; 
    } 
    fileBase.FetchAttributes(); 
    var fileByteLength = fileBase.Properties.Length; 
    var fileByteArray = new Byte[fileByteLength]; 

    fileBase.DownloadToByteArray(fileByteArray, 0); 

    return File(fileByteArray, fileBase.Properties.ContentType, fileName); 
} 
+0

Этот код полезен. Но в отношении загрузки: я хотел представить ссылку для загрузки в виде бритвы для ранее сохраненного файла, чтобы пользователь мог ее загрузить. Как получить URL-адрес (как переменную) в виде бритвы? (Мне не нужно загружать файл для себя). И как должен выглядеть контроллер (в случае, если он мне вообще нужен), чтобы начать загрузку? – Manu

+0

Является ли контейнер общедоступным? –

+0

да. но позже я хочу сделать то же самое с SAS – Manu