Откройте физический файл на сервере с помощью ASP.NET

Я хочу открыть физический файл на сервере по щелчку гиперссылки.

<asp:HyperLink ID="HyButton1" Target="_blank" NavigateUrl='<%#Eval("FullPath") %>' runat="server" Text="Open File" ></asp:HyperLink>

«Полный путь» похож на «E:\PINCDOCS\Mydoc.pdf».

В настоящее время в Chrome я получаю сообщение об ошибке.

Не разрешено загружать локальный ресурс:

Можно ли это сделать или любое другое альтернативное решение?


person chamara    schedule 15.05.2013    source источник
comment
Используйте кнопку ссылки; добавить обработчик события для кнопки; открыть файл на стороне сервера (используйте Server.MapPath method); затем транслируйте как pdf. Лучше, если это возможно, скопировать этот файл в каталог статических ресурсов и использовать обычную гиперссылку.   -  person mshsayem    schedule 15.05.2013
comment
чтобы клиент мог загрузить файл, вам нужен URL-адрес, сначала вам нужно преобразовать локальный путь вашего сервера в URL-адрес, вот ссылка для этого stackoverflow.com/questions/16007/< /а>   -  person Kiarash    schedule 15.05.2013


Ответы (2)


Физический файл должен находиться на веб-сайте IIS, в виртуальном каталоге или веб-приложении. Поэтому вам нужно создать виртуальный каталог E:\PINCDOCS. Инструкции см. здесь: http://support.microsoft.com/kb/172138

Затем в своем коде вы можете использовать такой код, как: http://geekswithblogs.net/AlsLog/archive/2006/08/03/87032.aspx, чтобы получить URL-адрес физического файла.

person Philip Pittle    schedule 15.05.2013
comment
Кроме того, если вы находитесь в той же сети, что и сервер, вы можете просто использовать сетевое имя: например: \\servername\e$\PINCDOCS\Mydoc.pdf, и тогда вам не придется возиться с IIS. - person Philip Pittle; 15.05.2013

Когда вы установите для NavigateUrl значение FullPath, Chrome увидит ссылку, локальную для компьютера пользователя, который обращается к сайту, а не для самого сервера.

Таким образом, вам всегда нужно указывать URL для любой гиперссылки в виде //someURL или http://someurl.

В вашем случае вам нужно удалить NavigateUrl и добавить обработчик OnClick, а внутри обработчика вы прочитаете файл с помощью FileStream и запишете содержимое файла в поток ответов, а затем сбросите его.

пример обработчика кликов:

context.Response.Buffer = false;
context.Response.ContentType = "the file mime type, ex: application/pdf";
string path = "the full path, ex:E:\PINCDOCS";

FileInfo file = new FileInfo(path);
int len = (int)file.Length, bytes;
context.Response.AppendHeader("content-length", len.ToString());
byte[] buffer = new byte[1024];
Stream outStream = context.Response.OutputStream;
using(Stream stream = File.OpenRead(path)) {
    while (len > 0 && (bytes =
        stream.Read(buffer, 0, buffer.Length)) > 0)
    {
        outStream.Write(buffer, 0, bytes);
        len -= bytes;
    }
}
person Haitham Shaddad    schedule 29.09.2016