2010-04-11 71 views

回答

2

這並不難。正如dtb所述,用戶的瀏覽器仍然會要求用戶下載文件的權限,他們可能會選擇在哪裏保存文件。所以它不會是完全自動的。

這裏是一個博客文章的鏈接,解釋如何完成這個using webforms。你有興趣的主要部分是這樣的:

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

這裏是一個鏈接棧溢出問題,這也解釋了how to do it in MVC

根據你的評論,你想在silverlight做到這一點。我不是silverlight的專家,但這裏有另一個關於堆棧溢出的問題,discusses the issue

+0

是否需要'Response.CacheControl =「No-Cache」? 「WriteFile」和「TransmitFile」有什麼不同? – abatishchev 2010-04-11 15:48:15

+0

@abatishchev:根據MSDN,「無緩存」是默認值。所以,你不需要設置它。 WriteFile和TransmitFile之間的區別在於Transmit不會緩衝內存中的內容。請參閱:http://forums.asp.net/t/1513111.aspx – 2010-04-11 15:56:38

+0

但我想在Silverlight應用程序中使用它,並沒有system.web命名空間,所以我不能使用響應 我怎樣才能讀取它到字節[] ??那可能嗎 ? – MirooEgypt 2010-04-11 16:15:30

1

可以使用WebClient下載WMV文件和SaveFileDialog要求用戶把它放在哪裏: -

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); 
    } 
} 

然而,目前情況下不顯示下載進度信息的一種方式。我希望這會進入Silverlight 4,但據我所知,它沒有。

+0

請給我一個'args'的例子嗎?你也沒有在代碼塊'web.OpenReadCompleted =(s,args)=>'中使用's',那是什麼? – 2014-07-21 20:01:06