2010-02-03 1 views
1

Я хотел бы быть в состоянии сделать это:Response.WriteFile с URL-адресом возможно?

Response.WriteFile ("http://domain/filepath/file.mpg") 

Но, я получаю эту ошибку:

Invalid path for MapPath 'http://domain/filepath/file.mpg' 
A virtual path is expected. 

Метод WriteFile не появляется на работе с URL. Есть ли другой способ написать содержание URL-адреса на моей странице?

Спасибо.

+0

Метод WriteFile записывает содержимое указанного файла непосредственно в выходной поток ответа HTTP как файловый блок. Вы не указали допустимый путь к файлу. – DaveB

ответ

2

Если вам нужен код, чтобы работать в этой манере, то вам придется динамически загрузить его на свой сервер первым:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://domain/filepath/file.mpg"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream file = response.GetResponseStream(); 

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

Я укажу, однако, что это не обязательно оптимально - вы будете убивать свою полосу пропускания, потому что каждый файл будет использовать гораздо больше ресурсов, чем необходимо.

Если возможно, переместите файл на свой сервер или переосмыслите то, что вы пытаетесь сделать.

+0

Архитектура будет такой, чтобы файл фактически хранился в облаке. Я бы хотел, чтобы пользователи загружались напрямую, не просматривая мой веб-сервер - таким образом я оптимизирую пропускную способность. Метод Response.Redirect работает, но, к сожалению, я не могу переименовать файл (файл хранится с идентификатором в имени). Любая идея, как я мог это сделать? – Nick

+0

В этом случае переадресуйте сценарий на другом сервере, который сделает это за вас. Проблема в том, что вы пытаетесь сделать что-то, что запрещено HTTP-протоколом (а именно, все должно быть 1 запрос клиента/1 ответ сервера) – riwalk

+0

Как использовать объект Stream в вашем ответе? Можно ли его каким-то образом связать с Response.AppendHeader («Content-Disposition», «attachment; filename = video.mpg»); так что я могу изменить имя? – Nick

0

В принципе у вас есть несколько вариантов. Вы можете загрузить файл на свой сервер и подавать его с помощью Response.WriteFile или вы можете перенаправить на фактическое местоположение. Если файл уже находится на вашем сервере, вам просто нужно указать путь к файловой системе Response.WriteFile вместо URL-адреса или использовать виртуальный URL-адрес, удалив http://domain.

0

Возможным решением было бы просто использовать:

Response.Redirect("http://domain/filepath/file.mpg") 

Но тогда, я не уверен, что это то, что вы на самом деле пытаетесь сделать или нет.

+1

С Response.WriteFile у меня есть возможность назначить имя загружаемого файла. Пример: Response.AppendHeader («Content-Disposition», «attachment; filename = video.mpg»); Я не могу сделать с reponse.redirect, если я не перехватил ответ и не изменил имя файла каким-либо образом – Nick