none
directorio compartido en el servidor \\servidor\dir\dir RRS feed

  • Pregunta

  • Buenos días.

    Necesito poder mostrar unos archivos en el cliente en una ruta compartida del servidor, el sistema en vb.net y SqlServer y el servidor esta dentro de una red.

    Sería posible?.

    Un saludo y gracias


    Marco

    martes, 12 de enero de 2021 13:01

Respuestas

  • Necesito poder mostrar unos archivos en el cliente en una ruta compartida del servidor [...] el servidor esta dentro de una red.

    Una observación acerca de esto: Será necesario que la carpeta compartida en red tenga permisos para las credenciales que tienen que leer esos ficheros. Y si la aplicación es MVC, las credenciales NO son las del usuario que está viendo la aplicación en su navegador, sino las credenciales del Pool de aplicaciones bajo el que la aplicación ha sido desplegada en IIS.

    Puedes cambiar esta cuenta desde las Propiedades Avanzadas del Pool. Si no la cambias, el valor predeterminado es una cuenta de servicio, que desde el punto de vista del servidor que contiene la carpeta compartida será vista como la cuenta de máquina del servidor web ("dominio\nombreDeMaquina$"). Por supuesto, esto fallará si ambos servidores no son miembros del mismo árbol de dominios.

    martes, 12 de enero de 2021 15:48

Todas las respuestas

  • Hola Marco,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    martes, 12 de enero de 2021 15:12
    Moderador
  • Hola MarcoGpex, te paso algo similar que hice, uso el identity para crear y logear los usuarios, luego de ingresado por requerimiento y para que otros usuarios no puedan ver dentro de la carpeta de cada usuario, cada usuario una vez creado a la vez crea una carpeta con el nombre de usuario dentro de una carpeta global el codigo esta en c# te lo paso

    la view index

    @{
        ViewBag.Title = "Folder Explorer";
    }
    
    <h2>@Model.FolderName</h2>
    
    @if (Model.URL.ToLower() != "/explorer/")
    {
        <a title="Parent"
           href="@Model.ParentFolderName">
            <img src="~/images/up.png" alt="Up" style="width: 20px; height: 20px; border: none" />
        </a>
    }
    
    <ul>
        @*Listing the directories *@
        @foreach (ZamoraCitrus.Models.DirModel dir in Model.DirModelList)
        {
            <li>
                <img src="~/images/folder.png" alt="Folder Logo" align="top" style="width: 20px;
                    height: 20px; border: none" />
                <a href="@(Model.URL + dir.DirName)/" title="@dir.DirName">@dir.DirName</a>
                . . . . . . @dir.DirAccessed
            </li>
        }
        @*Listing the files *@
        @foreach (ZamoraCitrus.Models.FileModel file in Model.FileModelList)
        {
            <li>
                <a href="@(Model.URL + file.FileName)"
                   title="@file.FileName" target="_blank">
                    @file.FileName
                </a>. . . . . . @file.FileSizeText
                . . . . . . @file.FileAccessed
            </li>
        }
    </ul>
    


    el model

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace ZamoraCitrus.Models
    {
        public class DirModel
        {
            public string DirName { get; set; }
            public DateTime DirAccessed { get; set; }
        }
    
        public class FileModel
        {
            public string FileName { get; set; }
            public string FileSizeText { get; set; }
            public DateTime FileAccessed { get; set; }
        }
        public class ExplorerModel
        {
            public List<DirModel> DirModelList;
            public List<FileModel> FileModelList;
    
            public String FolderName;
            public String ParentFolderName;
            public String URL;
    
            public ExplorerModel(List<DirModel> dirModelList, List<FileModel> fileModelList)
            {
                DirModelList = dirModelList;
                FileModelList = fileModelList;
            }
        }
    }

    y el controller

    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.FileProviders;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Threading.Tasks;
    using ZamoraCitrus.Models;
    using System.Security.Claims;
    namespace FolderExplorer.Controllers
    {
        public class ExplorerController : Controller
        {
            private readonly IHostingEnvironment _hostingEnvironment;
            private readonly IHttpContextAccessor _httpContextAccessor;
            private readonly IUserHelper userHelper;
    
            public ExplorerController(IHostingEnvironment hostingEnvironment,
                                      IHttpContextAccessor httpContextAccessor,
                                      IUserHelper userHelper)
            {
                _hostingEnvironment = hostingEnvironment;
                _httpContextAccessor = httpContextAccessor;
                this.userHelper = userHelper;
            }
    
            //
           
    
    
            public IActionResult Index(string path, string id)
            {
    
               var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.Name).Value;
                /////////////////////////////////////////////////@"D:\Clientes\"
    
                var folderPath = _hostingEnvironment.ContentRootPath + "\\Folder\\" + userId + "\\";
                
    
    
                var realPath = folderPath + path;
    
                if (System.IO.File.Exists(realPath))
                {
                    var fileBytes = System.IO.File.ReadAllBytes(realPath);
    
                    
                    return File(fileBytes, "application/force-download");
                }
                else if (System.IO.Directory.Exists(realPath))
                {
                    List<DirModel> dirListModel = MapDirs(realPath);
    
                    List<FileModel> fileListModel = MapFiles(realPath);
    
                    ExplorerModel explorerModel = new ExplorerModel(dirListModel, fileListModel);
    
    
                    if (realPath.Last() != '/' && realPath.Last() != '\\')
                    { explorerModel.URL = "/Explorer/" + path + "/"; }
                    else
                    { explorerModel.URL = "/Explorer/" + path; }
    
                    var request = _httpContextAccessor.HttpContext.Request;
    
                    UriBuilder uriBuilder = new UriBuilder
                    { Path = request.Path.ToString() };
    
    
                    explorerModel.FolderName = WebUtility.UrlDecode(uriBuilder.Uri.Segments.Last());
    
    
                    Uri uri = new Uri(uriBuilder.Uri.AbsoluteUri.Remove
                                        (uriBuilder.Uri.AbsoluteUri.Length - uriBuilder.Uri.Segments.Last().Length));
    
                    explorerModel.ParentFolderName = uri.AbsolutePath;
    
                    return View(explorerModel);
                    //return this.RedirectToAction(nameof(Index));
                }
                else
                {
                    return Content(path + " is not a valid file or directory.");
                }
            }
    
            private List<DirModel> MapDirs(String realPath)
            {
                List<DirModel> dirListModel = new List<DirModel>();
    
                IEnumerable<string> dirList = Directory.EnumerateDirectories(realPath);
                foreach (string dir in dirList)
                {
                    DirectoryInfo d = new DirectoryInfo(dir);
    
                    DirModel dirModel = new DirModel
                    {
                        DirName = Path.GetFileName(dir),
                        DirAccessed = d.LastAccessTime
                    };
    
                    dirListModel.Add(dirModel);
                }
    
                return dirListModel;
            }
    
            private List<FileModel> MapFiles(String realPath)
            {
                List<FileModel> fileListModel = new List<FileModel>();
    
                IEnumerable<string> fileList = Directory.EnumerateFiles(realPath);
                foreach (string file in fileList)
                {
                    FileInfo f = new FileInfo(file);
    
                    FileModel fileModel = new FileModel();
    
                    if (f.Extension.ToLower() != "php" && f.Extension.ToLower() != "aspx"
                        && f.Extension.ToLower() != "asp" && f.Extension.ToLower() != "exe")
                    {
                        fileModel.FileName = Path.GetFileName(file);
                        fileModel.FileAccessed = f.LastAccessTime;
                        fileModel.FileSizeText = (f.Length < 1024) ? f.Length.ToString() + " B" : f.Length / 1024 + " KB";
    
                        fileListModel.Add(fileModel);
                    }
                }
    
                return fileListModel;
            }
    
        }
    }

    espero te sirva Saludos

    martes, 12 de enero de 2021 15:42
  • Necesito poder mostrar unos archivos en el cliente en una ruta compartida del servidor [...] el servidor esta dentro de una red.

    Una observación acerca de esto: Será necesario que la carpeta compartida en red tenga permisos para las credenciales que tienen que leer esos ficheros. Y si la aplicación es MVC, las credenciales NO son las del usuario que está viendo la aplicación en su navegador, sino las credenciales del Pool de aplicaciones bajo el que la aplicación ha sido desplegada en IIS.

    Puedes cambiar esta cuenta desde las Propiedades Avanzadas del Pool. Si no la cambias, el valor predeterminado es una cuenta de servicio, que desde el punto de vista del servidor que contiene la carpeta compartida será vista como la cuenta de máquina del servidor web ("dominio\nombreDeMaquina$"). Por supuesto, esto fallará si ambos servidores no son miembros del mismo árbol de dominios.

    martes, 12 de enero de 2021 15:48
  • Hola EnzoTuc40.

    Gracias por responder, pero estas utilizando aspnetCore y yo no.

    Intentaré a ver si puede adaptarlo.

    Un saludo


    Marco

    miércoles, 13 de enero de 2021 8:09
  • Hola EnzoTuc40.

    Gracias por responder, pero estas utilizando aspnetCore y yo no.

    Intentaré a ver si puede adaptarlo.

    Un saludo


    Marco

    Hola Marcos. En realidad yo buscando y buscando lo adapte, pero lo que encontré leyendo era lo que estas buscando, disculpa la demora, y es un código que adapte hace un tiempo no recuerdo las fuentes originales, si no te las pasaría. Saludos
    jueves, 21 de enero de 2021 22:35