2010-04-11 4 views

Répondre

2

Ce n'est pas si difficile à faire. Comme le mentionne dtb, le navigateur de l'utilisateur demandera toujours à l'utilisateur la permission de télécharger le fichier, et il aura la possibilité de choisir où enregistrer le fichier. Donc, ce ne sera pas complètement automatique.

Voici un lien vers un article de blog expliquant comment cela est fait using webforms. La partie principale qui vous intéresse est la suivante:

Response.ContentType = "video/x-ms-wmv"; 
Response.AppendHeader("Content-Disposition","attachment; filename=MyMovie.wmv"); 
Response.TransmitFile(Server.MapPath("~/videos/MyMovie.wmv")); 
Response.End(); 

est ici une pile de lien question de débordement qui explique how to do it in MVC.

Basé sur votre commentaire, vous voulez le faire dans silverlight. Je ne suis pas un expert en Silverlight, mais voici une autre question sur le débordement de pile discusses the issue.

+0

Est-ce que 'Response.CacheControl = "No-Cache" n'est pas nécessaire? Et quelle est la différence entre 'WriteFile' et' TransmitFile'? – abatishchev

+0

@abatishchev: Selon MSDN, "No-Cache" est la valeur par défaut. Donc, vous n'avez pas besoin de le définir. La différence entre WriteFile et TransmitFile est que Transmit ne met pas le contenu en mémoire tampon. Voir: http://forums.asp.net/t/1513111.aspx –

+0

Mais je veux l'utiliser dans l'application silverlight et il n'y a pas d'espace de noms system.web donc je ne peux pas utiliser la réponse comment puis-je le lire en octet [] ?? est-ce possible ? – MirooEgypt

1

Vous pouvez utiliser le WebClient pour télécharger un fichier wmv et le SaveFileDialog de demander à l'utilisateur où le mettre: -

void DownloadButton_Click(object sender, RoutedEventArgs e) 
{ 
    var dialog = new SaveFileDialog(); 
    if (dialog.ShowDialog().Value) 
    { 
    var web = new WebClient(); 
    web.OpenReadCompleted = (s, args) => 
    { 
     try 
     { 
     using (args.Result) 
     using (Stream streamOut = args.UserState As Stream) 
     { 
      Pump(args.Result, streamOut); 
     } 
     } 
     catch 
     { 
     // Do something sensible when the download has failed. 
     } 

    }; 
    web.OpenReadAsync(UriOfWmv, ShowDialog.OpenFile()); 
    } 
} 

private static void Pump(Stream input, Stream output) 
{ 
    byte[] bytes = new byte[4096]; 
    int n; 

    while((n = input.Read(bytes, 0, bytes.Length)) != 0) 
    { 
    output.Write(bytes, 0, n); 
    } 
} 

Cependant actuellement il n'y a pas moyen d'afficher des informations de progression de téléchargement. J'espérais que cela entrerait dans le Silverlight 4 mais pour autant que je puisse voir ce n'est pas le cas.

+0

Pourriez-vous s'il vous plaît me donner un exemple de 'args'? De plus, vous n'avez pas utilisé 's' dans le bloc de code' web.OpenReadCompleted = (s, args) => ', qu'est-ce que c'était? –

Questions connexes