Как открыть файл с его приложением (файл не существует на веб-сервере)? - PullRequest
2 голосов
/ 27 августа 2010

Я хочу спросить, как открыть определенный файл (файл отсутствует на сервере, у меня есть относительный путь к нему, сохраненный в файле конфигурации) с его приложением, при нажатии на конкретную кнопку ссылки или гиперссылку ...

как:

открытие

.docx со словом.

или

PDF с Acrobat Reader

Я пробовал несколько методов, но я получаю различные ошибки, такие как

Не удается использовать ведущий .. для выхода из верхней директории

мои .cs:

public void ProcessRequest(HttpContext context)
        {

                int newsId = int.Parse(context.Session["newsId"].ToString());
                int FK_UnitId = int.Parse(context.Session["UserData"].ToString());
                string dirPathForTextFiles = ConfigurationManager.AppSettings.GetValues("ThePath").First() + "/" + "NewsTextFiles" + "/" + "UnitNum" + FK_UnitId.ToString() + "_" + "NewsNum" + newsId + "/";
                DataTable UpdatedDateTable = (DataTable)context.Session["theLastUpdatedTextFile"];
                UpdatedDateTable.AcceptChanges();
                context.Session.Add("currentTextFile", UpdatedDateTable);
                List<string> l = new List<string>(UpdatedDateTable.Rows.Count);

                try
                {

                    l.Add(dirPathForTextFiles + UpdatedDateTable.Rows[0]["fileName"].ToString());
                    context.Response.ContentType = getContentType(dirPathForTextFiles + UpdatedDateTable.Rows[0]["fileName"].ToString());
                    System.Diagnostics.Process.Start(l[0]);         
                    context.ClearError();

                }
                catch (IOException e)
                {
                    string message = e.Message;
                }


        }

        string getContentType(String path)
        {
            switch (Path.GetExtension(path))
            {
                case ".doc": return "   application/msword";
                case ".docx": return "application/msword";
                case ".pdf": return "application/pdf";

                default: break;
            }
            return "";
        }

Ответы [ 2 ]

5 голосов
/ 27 августа 2010

Чтобы получить полный путь к файлу на сервере, вам нужно использовать Server.MapPath.

string fullFileName = Server.MapPath("../myFile.pdf");

Редактировать : после этого вам понадобится объект Process.чтобы «запустить» его:

System.Diagnostics.Process.Start(fullFileName);

Редактировать 2 : если вы хотите, чтобы файл открывался на стороне клиента, лучше всего создать и Обработчик HTTP и установите соответствующий тип MIME в своем ответе перед его передачей из обработчика.

Редактирование 3 : код для потоковой передачи файла клиенту.

public void ProcessRequest(HttpContext context)  
{   
   int newsId = int.Parse(context.Session["newsId"].ToString());
   int FK_UnitId = int.Parse(context.Session["UserData"].ToString());
   string dirPathForTextFiles =  ConfigurationManager.AppSettings.GetValues("ThePath").First() + "/" + "NewsTextFiles" + "/" + "UnitNum" + FK_UnitId.ToString() + "_" + "NewsNum" + newsId + "/";
   DataTable UpdatedDateTable = (DataTable)context.Session["theLastUpdatedTextFile"];
   UpdatedDateTable.AcceptChanges();
   context.Session.Add("currentTextFile", UpdatedDateTable);
   List<string> l = new List<string>(UpdatedDateTable.Rows.Count);

   try
   {

      l.Add(dirPathForTextFiles + UpdatedDateTable.Rows[0]["fileName"].ToString());
       context.Response.ContentType = getContentType(dirPathForTextFiles + UpdatedDateTable.Rows[0]["fileName"].ToString());
       using (FileStream fs = new FileStream(l[0], FileMode.Open, FileAccess.Read))
       {
          long chunkSize = fs.Length; 
          byte[] buf = new byte[chunkSize]; 
          int bytesRead = 1; 
          bytesRead = fs.Read(buf, 0,(int)chunkSize); 
          if (bytesRead > 0) context.Response.OutputStream.Write(buf, 0, buf.Length);
          context.Response.OutputStream.Flush();
      }

  }
  catch (IOException e)
  {
     string message = e.Message;
  }   
}
0 голосов
/ 27 августа 2010

System.Diagnostics.Process.Start («Начать путь к файлу»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...