ASP.NET файловый браузер перевод пути - PullRequest
2 голосов
/ 20 июня 2011

Я работаю в файловом браузере asp.net, который рекурсивно просматривает папки и перечисляет их файлы и подпапки. Однако я также хочу, чтобы файлы можно было загружать / просматривать, и там у меня, похоже, есть проблема. Я не могу правильно перевести адрес. У меня есть следующая конфигурация и код.

Редактировать

Проблема в том, что ссылки создаются

Response.Write(space + "<a href=" + "Upload/" + d.Name + ">" + d.FullName + "</a><br/>");

Не указывайте ссылку на файл правильно. Также есть проблема с бонусами, которую мне нужно решить: некоторые имена файлов содержат пробелы.

Web.config

<appSettings>
  <add key="UploadDirectory" value="~/Upload/"/>
</appSettings>

FileBrowser.aspx.cs

public partial class FileBrowser : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {        
        DirectoryInfo di = new DirectoryInfo(Request.MapPath(System.Configuration.ConfigurationManager.AppSettings["UploadDirectory"]));
        if (Directory.Exists(di.ToString()))
            printDir("", di.ToString());

    }

    protected void printDir(string space, string dir)
    {
        DirectoryInfo di = new DirectoryInfo(dir);
        foreach (DirectoryInfo d in di.GetDirectories())
        {
            Response.Write(space + "<a href=" + d.ToString() + ">" + d.ToString() + "</a><br/>");
            printDir(space + "&nbsp;&nbsp;&nbsp;&nbsp;", dir + "\\" + d.ToString());
        }

        foreach (FileInfo d in di.GetFiles())
        {
            Response.Write(space + "<a href=" + "Upload/" + d.Name + ">" + d.FullName + "</a><br/>");
        }
    }
}

Ответы [ 3 ]

1 голос
/ 20 июня 2011

Проблема в том, что при рендеринге пути к файлам во вложенных папках вы используете путь типа «Загрузить / имя файла»; это не правильно.

На самом деле вы должны попытаться получить имена каталогов из текущей переменной di. То есть, если вы сейчас просматриваете папку «Inner» внутри папки «Upload», ваш путь будет выглядеть как «Upload / Inner / filename».

Здесь необходимо внести изменения:

  Response.Write(space + "<a href=" + "Upload/" + d.Name + ">" + d.FullName + "</a><br/>");

В приведенной выше строке кода вам необходимо динамически создавать URL-адрес href в зависимости от пути в переменной di. Сделайте следующее:

  1. Получить ди путь
  2. Получить подстроку после "\ Upload" в пути di
  3. Разбить указанную подстроку на "\"; это даст вам любые подкаталоги.
  4. Создайте новый путь к файлу, используя вышеуказанные подкаталоги.

Надеюсь, это поможет.

1 голос
/ 20 июня 2011

Это гораздо более читабельно:

foreach (FileInfo d in di.GetFiles("*", SearchOption.AllDirectories)) // includes subfolders
{
    Response.Write(String.Format("{0}<a href=\"{1}\">{2}</a>", space, Server.MapPath("~/Upload/") + d.Name, d.FullName);
}

Также попробуйте DirectoryInfo.EnumerateFile()

1 голос
/ 20 июня 2011

Вы пробовали что-то подобное?

foreach (FileInfo d in di.GetFiles())
{
    Response.Write(space + "<a href=" + Server.MapPath("~/Upload/") + d.Name + ">" + d.FullName + "</a><br/>");
}
...