Un saludo amantes de la informática, en este post vamos ha hablar sobre el uso de los permisos SAS con azure file storage. Los pasos que seguiremos serán:

  1. La creación de la cuenta azure storage y la creacion de las claves.
  2. Crearemos el acceso a los ficheros en azure file storage.
  3. Por ultimo crearemos el token y daremos acceso a los permisos SAS.

Creamos la cuenta azure storage

Vamos a crearnos una cuenta de azure storage donde accederemos a un recurso que tendremos en azure files, cuando lo hayamos conseguido incluiremos el acceso mediante SAS.

azurefilestoragedpm
Creacion de cuenta azure file storage

Ahora nos crearemos un proyecto MVC.Net framework, en dicho proyecto tendremos que instalar 3 Nugets para la conexion con azure, dichos Nugets son:

Nos dirigimos ahora al fichero web.config y configuramos el appsettings con la clave de acceso de nuestra cuenta de azure storage.

<configuration>
  <appSettings>
    <add key="cadenaazurefilestorage" value="DefaultEndpointsProtocol=########################################################################################"/>
  </appSettings>

Accedemos a nuestros ficheros en azure

Empezaremos creándonos un repositorio donde configuraremos la conexión y los parámetros de conexión (lectura, escritura, etc..) hacia la api.

public class RepositoryAzureApi
    {
        public Uri GenerarTokenFile()
        {
            string clave = CloudConfigurationManager.GetSetting("cadenaazurefilestorage");
            CloudStorageAccount cuenta = CloudStorageAccount.Parse(clave);
            CloudFileClient cliente = cuenta.CreateCloudFileClient();
            CloudFileShare recursoCompartido = cliente.GetShareReference("filestorage");

            SharedAccessFilePolicy permisos = new SharedAccessFilePolicy();
            permisos.SharedAccessExpiryTime = DateTime.Now.AddMinutes(5);
            permisos.Permissions = SharedAccessFilePermissions.Create 
                | SharedAccessFilePermissions.Delete 
                | SharedAccessFilePermissions.List 
                | SharedAccessFilePermissions.Read 
                | SharedAccessFilePermissions.Write;

            string strToken = recursoCompartido.GetSharedAccessSignature(permisos);
            string aux = recursoCompartido.Uri + strToken;
            Uri token = new Uri(aux);

            return token;
        }
    }

Y un repositorio con los metodos estandar ya sabidos por todos como: crear, mostrar y eliminar.

public class RepositoryFileAzureStorage
    {

        RepositoryAzureApi azureApi;

        public RepositoryFileAzureStorage()
        {
            azureApi = new RepositoryAzureApi();
        }

        public void CrearFichero(HttpPostedFileBase fichero)
        {
            Uri token = azureApi.GenerarTokenFile();
            CloudFileShare recursoCompartido = new CloudFileShare(token);
            CloudFileDirectory Directorio = recursoCompartido.GetRootDirectoryReference();

            string nombre = fichero.FileName;
            if (nombre != "ficheromuestra.txt")
            {
                CloudFile file = Directorio.GetFileReference(nombre);
                file.UploadFromStream(fichero.InputStream);
            }
        }

        public List<string> GetListadoFicheros()
        {
            Uri token = azureApi.GenerarTokenFile();
            CloudFileShare recursoCompartido = new CloudFileShare(token);
            CloudFileDirectory Directorio = recursoCompartido.GetRootDirectoryReference();

            IEnumerable<IListFileItem> lista = Directorio.ListFilesAndDirectories();
            List<string> datos = new List<string>();
            foreach (IListFileItem i in lista)
            {
                string aux = i.Uri.ToString();
                int pos = aux.LastIndexOf('/') + 1;
                aux = aux.Substring(pos);
                datos.Add(aux);
            }

            return datos;
        }

        public void EliminarFichero(string nombre)
        {
            Uri token = azureApi.GenerarTokenFile();
            CloudFileShare recursoCompartido = new CloudFileShare(token);
            CloudFileDirectory Directorio = recursoCompartido.GetRootDirectoryReference();

            CloudFile file = Directorio.GetFileReference(nombre);
            file.DeleteIfExists();
        }
    }

Ya con los repositorios configurados, nos creamos el controlador, el cual tendra un metodo get y post.

En el get añadiremos la funcionalidad de eliminar y en el post la de subir un archivo y mostrar todos los archivos.

// GET: Index
        [HttpGet]
        public ActionResult Index(string accion, string fichero)
        {
            if (accion == "eliminar")
            {
                repository.EliminarFichero(fichero);
            }

            List<string> ficheros = repository.GetListadoFicheros();
            ViewBag.Ficheros = ficheros;


            return View();
        }

        // POST: Index
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Index(string accion, HttpPostedFileBase ficheroSubir)
        {
            List<string> ficheros = repository.GetListadoFicheros();
            ViewBag.Ficheros = ficheros;

            if (accion == "subir")
            {
                repository.CrearFichero(ficheroSubir);
            }

            return View();
        }

Ejecutamos el proyecto y comprobamos como funciona correctamente la subida del archivo hacia nuestra cuenta de azure.

uploadfileazuredpm
Subida de fichero a azure

El código del proyecto lo dejare subido a mi GitHub para que los que queráis lo descargáis y lo probéis.

Descargar proyecto

También podéis encontrarme en LinkedIn

Un saludo a todos!!!!

Autor/a: David Pozuelo Martinez
Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin
Centro: Tajamar
Año académico: 2018-2019

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.