2010-02-03 6 views
1

Je voudrais être en mesure de le faire:Response.WriteFile avec une URL possible?

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

Mais, je reçois cette erreur:

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

La méthode WriteFile ne semble pas fonctionner avec des URL. Y a-t-il un autre moyen d'écrire le contenu d'une URL sur ma page?

Merci.

+0

La méthode WriteFile écrit le contenu du fichier spécifié directement dans un flux de sortie de réponse HTTP en tant que bloc de fichier. Vous n'avez pas spécifié un chemin d'accès valide à un fichier. – DaveB

Répondre

2

Si vous avez besoin du code pour travailler de cette manière, vous devrez télécharger dynamiquement sur votre serveur premier:

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

A partir de ce moment-là, vous avez le contenu du fichier en tant que flux, et vous devrez lire/écrire les octets à la réponse.

Je mentionnerai cependant que ce n'est pas nécessairement optimal - vous allez tuer votre bande passante, car chaque fichier utilisera beaucoup plus de ressources que nécessaire.

Si possible, déplacez le fichier sur votre serveur ou repensez exactement ce que vous essayez de faire.

+0

L'architecture sera telle que le fichier est réellement stocké sur le nuage. Je voudrais que les utilisateurs téléchargent directement sans passer par mon serveur web - de cette façon j'optimise la bande passante. La méthode Response.Redirect fonctionne mais, malheureusement, je ne peux pas renommer le fichier (le fichier est stocké avec l'ID dans le nom). Une idée de comment je pourrais faire ça? – Nick

+0

Dans ce cas, redirigez vers un script sur l'autre serveur qui le fait pour vous. Le problème est que vous essayez de faire quelque chose qui n'est pas autorisé par le protocole HTTP (à savoir, tout doit être 1 demande client/1 réponse du serveur) – riwalk

+0

Comment utiliser l'objet Stream dans votre réponse? Peut-il être utilisé pour se rapprocher du Response.AppendHeader ("Content-Disposition", "attachment; filename = video.mpg"); pour que je puisse changer le nom? – Nick

0

Fondamentalement, vous avez plusieurs choix. Vous pouvez soit télécharger le fichier sur votre serveur et le servir avec Response.WriteFile, soit rediriger vers l'emplacement actuel. Si le fichier est déjà sur votre serveur, il vous suffit de fournir un chemin de système de fichiers à Response.WriteFile au lieu de l'url, ou d'utiliser une URL virtuelle, en supprimant http://domain.

0

Une solution possible serait d'utiliser simplement:

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

Mais alors, je ne sais pas si cela est vraiment ce que vous essayez de faire ou non.

+1

Avec Response.WriteFile, j'ai la possibilité d'attribuer le nom du fichier téléchargeable. Ex: Response.AppendHeader ("Content-Disposition", "pièce jointe; nom_fichier = video.mpg"); Je ne peux pas faire avec un reponse.redirect à moins que j'intercepte la réponse et change le nom de fichier en quelque sorte – Nick

Questions connexes