亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

Silverlight文件上傳下載實現方法(下載保存)

2020-01-24 01:23:52
字體:
來源:轉載
供稿:網友

search了非常多的文章,總算勉強實現了。有許多不完善的地方。


在HCLoad.Web項目下新建目錄Pics復制一張圖片到根目錄下。

圖片名:Bubble.jpg 右擊->屬性->生成操作:Resource


UC_UpDown.xaml

<UserControl x:Class="HCLoad.UC_UpDown"  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   Width="500" Height="500">  <StackPanel Background="White" Height="450">    <Button Content="down" Click="Button_Click"></Button>    <HyperlinkButton Content="下載保存" NavigateUri="http://localhost:4528/download.ashx?fileName=aa.txt" TargetName="_self" x:Name="lBtnDown" />    <TextBlock x:Name="tbMsgString" Text="下載進度" TextAlignment="Center" Foreground="Green"></TextBlock>    <Button x:Name="btnDownload" Content="DownLoad Pictures" Width="150" Height="35" Margin="15" Click="btnDownload_Click"/>    <Border Background="Wheat" BorderThickness="5" Width="400" Height="280">      <Image x:Name="imgDownLoad" Width="400" Height="300" Margin="15" Stretch="Fill"/>    </Border>    <Button x:Name="btnUpLoad" Content="UpLoad Pictures" Width="150" Height="35" Margin="15" Click="btnUpLoad_Click"/>  </StackPanel></UserControl>

UC_UpDown.xaml.cs

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using System.Windows.Media.Imaging; //因為要使用BitmapImageusing System.IO; //因為要使用Streamnamespace HCLoad{  public partial class UC_UpDown : UserControl  {    //1、WebClient 對象一次只能啟動一個請求。如果在一個請求完成(包括出錯和取消)前,即IsBusy為true時,進行第二個請求,則第二個請求將會拋出 NotSupportedException 類型的異常    //2、如果 WebClient 對象的 BaseAddress 屬性不為空,則 BaseAddress 與 URI(相對地址) 組合在一起構成絕對 URI    //3、WebClient 類的 AllowReadStreamBuffering 屬性:是否對從 Internet 資源接收的數據做緩沖處理。默認值為true,將數據緩存在客戶端內存中,以便隨時被應用程序讀取    //獲取選定圖片信息    System.IO.FileInfo fileinfo;    public UC_UpDown()    {      InitializeComponent();    }    #region 下載圖片    private void btnDownload_Click(object sender, RoutedEventArgs e)    {      //向指定的Url發送下載流數據請求       String imgUrl = "http://localhost:4528/Bubble.jpg";      Uri endpoint = new Uri(imgUrl);      WebClient client = new WebClient();      client.OpenReadCompleted += new OpenReadCompletedEventHandler(OnOpenReadCompleted);      client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(clientDownloadStream_DownloadProgressChanged);      client.OpenReadAsync(endpoint);    }    void OnOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)    {      //OpenReadCompletedEventArgs.Error - 該異步操作期間是否發生了錯誤      //OpenReadCompletedEventArgs.Cancelled - 該異步操作是否已被取消      //OpenReadCompletedEventArgs.Result - 下載后的 Stream 類型的數據      //OpenReadCompletedEventArgs.UserState - 用戶標識      if (e.Error != null)      {        MessageBox.Show(e.Error.ToString());        return;      }      if (e.Cancelled != true)      {        //獲取下載的流數據(在此處是圖片數據)并顯示在圖片控件中        //Stream stream = e.Result;        //BitmapImage bitmap = new BitmapImage();        //bitmap.SetSource(stream);        //imgDownLoad.Source = bitmap;        Stream clientStream = e.UserState as Stream;        Stream serverStream = (Stream)e.Result;        byte[] buffer = new byte[serverStream.Length];        serverStream.Read(buffer, 0, buffer.Length);        clientStream.Write(buffer, 0, buffer.Length);        clientStream.Close();        serverStream.Close();      }    }    void clientDownloadStream_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)    {      //DownloadProgressChangedEventArgs.ProgressPercentage - 下載完成的百分比      //DownloadProgressChangedEventArgs.BytesReceived - 當前收到的字節數      //DownloadProgressChangedEventArgs.TotalBytesToReceive - 總共需要下載的字節數      //DownloadProgressChangedEventArgs.UserState - 用戶標識      this.tbMsgString.Text = string.Format("完成百分比:{0} 當前收到的字節數:{1} 資料大?。簕2} ",       e.ProgressPercentage.ToString() + "%",       e.BytesReceived.ToString(),       e.TotalBytesToReceive.ToString());    }    #endregion    #region 上傳圖片    private void btnUpLoad_Click(object sender, RoutedEventArgs e)    {      /**/      /*     *   OpenWriteCompleted - 在打開用于上傳的流完成時(包括取消操作及有錯誤發生時)所觸發的事件     *   WriteStreamClosed - 在寫入數據流的異步操作完成時(包括取消操作及有錯誤發生時)所觸發的事件     *   UploadProgressChanged - 上傳數據過程中所觸發的事件。如果調用 OpenWriteAsync() 則不會觸發此事件     *   Headers - 與請求相關的的標頭的 key/value 對**     *   OpenWriteAsync(Uri address, string method, Object userToken) - 打開流以使用指定的方法向指定的 URI 寫入數據     *     Uri address - 接收上傳數據的 URI     *     string method - 所使用的 HTTP 方法(POST 或 GET)     *     Object userToken - 需要上傳的數據流     */      OpenFileDialog openFileDialog = new OpenFileDialog()      { //彈出打開文件對話框要求用戶自己選擇在本地端打開的圖片文件        Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*",        Multiselect = false //不允許多選       };      if (openFileDialog.ShowDialog() == true)//.DialogResult.OK)      {        //fileinfo = openFileDialog.Files; //取得所選擇的文件,其中Name為文件名字段,作為綁定字段顯示在前端        fileinfo = openFileDialog.File;        if (fileinfo != null)        {          WebClient webclient = new WebClient();          string uploadFileName = fileinfo.Name.ToString(); //獲取所選文件的名字          #region 把圖片上傳到服務器上          Uri upTargetUri = new Uri(String.Format("http://localhost:4528/WebClientUpLoadStreamHandler.ashx?fileName={0}", uploadFileName), UriKind.Absolute); //指定上傳地址          webclient.OpenWriteCompleted += new OpenWriteCompletedEventHandler(webclient_OpenWriteCompleted);          webclient.Headers["Content-Type"] = "multipart/form-data";          webclient.OpenWriteAsync(upTargetUri, "POST", fileinfo.OpenRead());          webclient.WriteStreamClosed += new WriteStreamClosedEventHandler(webclient_WriteStreamClosed);          #endregion        }        else        {          MessageBox.Show("請選取想要上載的圖片!!!");        }      }    }    void webclient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)    {      //將圖片數據流發送到服務器上      // e.UserState - 需要上傳的流(客戶端流)      Stream clientStream = e.UserState as Stream;      // e.Result - 目標地址的流(服務端流)      Stream serverStream = e.Result;      byte[] buffer = new byte[4096];      int readcount = 0;      // clientStream.Read - 將需要上傳的流讀取到指定的字節數組中      while ((readcount = clientStream.Read(buffer, 0, buffer.Length)) > 0)      {        // serverStream.Write - 將指定的字節數組寫入到目標地址的流        serverStream.Write(buffer, 0, readcount);      }      serverStream.Close();      clientStream.Close();    }    void webclient_WriteStreamClosed(object sender, WriteStreamClosedEventArgs e)    {      //判斷寫入是否有異常      if (e.Error != null)      {        System.Windows.Browser.HtmlPage.Window.Alert(e.Error.Message.ToString());      }      else      {        System.Windows.Browser.HtmlPage.Window.Alert("圖片上傳成功!!!");      }    }    #endregion    private void Button_Click(object sender, RoutedEventArgs e)    {      //這種方法搞不定,好像提示跨域操作。      //提示:錯誤:Unhandled Error in Silverlight Application 跨線程訪問無效。      //Uri upTargetUri = new Uri(String.Format("http://localhost:4528/download.ashx?filename={0}", "123.jpg"), UriKind.Absolute); //指定上傳地址      //WebRequest request = WebRequest.Create(upTargetUri);      //request.Method = "GET";      //request.ContentType = "application/octet-stream";      //request.BeginGetResponse(new AsyncCallback(RequestReady), request);      //通過調用js代碼下載,比較簡單。      System.Windows.Browser.HtmlPage.Window.Eval("window.location.href='http://localhost:4528/download.ashx?filename=123.jpg';");    }    void RequestReady(IAsyncResult asyncResult)    {      MessageBox.Show("RequestComplete");    }  }}

在HCLoad.Web項目下新建WebClientUpLoadStreamHandler.ashx

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO; //因為要用到Streamnamespace HCLoad.Web{  public class WebClientUpLoadStreamHandler : IHttpHandler  {    public void ProcessRequest(HttpContext context)    {      //獲取上傳的數據流      string fileNameStr = context.Request.QueryString["fileName"];      Stream sr = context.Request.InputStream;      try      {        string filename = "";        filename = fileNameStr;        byte[] buffer = new byte[4096];        int bytesRead = 0;        //將當前數據流寫入服務器端文件夾ClientBin下        string targetPath = context.Server.MapPath("Pics/" + filename + ".jpg");        using (FileStream fs = File.Create(targetPath, 4096))        {          while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0)          {            //向文件中寫信息            fs.Write(buffer, 0, bytesRead);          }        }        context.Response.ContentType = "text/plain";        context.Response.Write("上傳成功");      }      catch (Exception e)      {        context.Response.ContentType = "text/plain";        context.Response.Write("上傳失敗, 錯誤信息:" + e.Message);      }      finally      { sr.Dispose(); }    }    public bool IsReusable    {      get      {        return false;      }    }  }}

新建download.ashx

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;using System.Net;namespace HCLoad.Web{  /// <summary>  /// $codebehindclassname$ 的摘要說明  /// </summary>  public class download : IHttpHandler  {    private long ChunkSize = 102400;//100K 每次讀取文件,只讀取100K,這樣可以緩解服務器的壓力    public void ProcessRequest(HttpContext context)    {      //string fileName = "123.jpg";//客戶端保存的文件名      String fileName = context.Request.QueryString["filename"];       string filePath = context.Server.MapPath("Bubble.jpg");      System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);      if (fileInfo.Exists == true)      {        byte[] buffer = new byte[ChunkSize];        context.Response.Clear();        System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);        long dataLengthToRead = iStream.Length;//獲得下載文件的總大小        context.Response.ContentType = "application/octet-stream";        //通知瀏覽器下載文件而不是打開        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));        while (dataLengthToRead > 0 && context.Response.IsClientConnected)        {          int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//讀取的大小          context.Response.OutputStream.Write(buffer, 0, lengthRead);          context.Response.Flush();          dataLengthToRead = dataLengthToRead - lengthRead;        }        context.Response.Close();        context.Response.End();      }      //context.Response.ContentType = "text/plain";      //context.Response.Write("Hello World");    }    public bool IsReusable    {      get      {        return false;      }    }  }}

參考:
http://www.cnblogs.com/wsdj-ittech/archive/2009/08/26/1554056.html
http://www.cnblogs.com/wsdj-ittech/archive/2009/08/25/1553534.html
http://www.cnblogs.com/wmt1708/archive/2009/03/07/1405009.html
http://topic.csdn.net/u/20090918/10/5e41ab52-f514-46b5-ae6a-d69ddb197213.html
http://www.cnblogs.com/wsdj-ittech/archive/2009/08/25/1553534.html
http://www.cnblogs.com/gwazy/archive/2009/04/02/1427781.html
http://www.cnblogs.com/ewyb/archive/2009/12/10/1621020.html
http://blog.csdn.net/emily1900/archive/2010/06/08/5655726.aspx

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美麻豆久久久久久中文| 欧美最猛性xxxxx亚洲精品| 久久精品国产成人| 欧美精品免费看| 欧美国产视频一区二区| 国产一区二区成人| 视频在线一区二区| 国产精品久久久久久久久久免费| 亚洲乱码国产乱码精品精| 欧美一乱一性一交一视频| 成人午夜激情免费视频| 日韩激情av在线免费观看| 久久久久久久久久久免费精品| 亚洲欧美国产精品久久久久久久| 欧美自拍视频在线| 欧美综合在线第二页| 亚洲xxxx做受欧美| 亚洲人免费视频| 亚洲欧美综合v| 在线看片第一页欧美| 精品久久久一区| 国产亚洲成av人片在线观看桃| 日韩欧美国产成人| 日韩精品高清在线| 韩国v欧美v日本v亚洲| 色噜噜久久综合伊人一本| 成人精品在线观看| 成人精品一区二区三区| 国产日韩欧美在线看| 国产精品高潮呻吟久久av无限| 久久精品国产91精品亚洲| 亚洲2020天天堂在线观看| 亚洲欧美制服中文字幕| 亚洲xxx自由成熟| 777午夜精品福利在线观看| 国产精品18久久久久久麻辣| 国产精品十八以下禁看| 国产精品丝袜视频| 久久久久久免费精品| 大荫蒂欧美视频另类xxxx| 欧美国产在线视频| 国产成人中文字幕| 亚洲免费av电影| 国产精品wwwwww| 亚洲a在线观看| 午夜精品视频在线| 欧美乱妇高清无乱码| 精品女厕一区二区三区| 久久久久久国产精品三级玉女聊斋| 精品久久久久国产| 日韩专区在线观看| 亚洲成成品网站| 欧美综合国产精品久久丁香| 亚洲天堂av图片| 九九热精品在线| 91精品久久久久久久久久入口| 亚洲一区国产精品| 伊人久久男人天堂| 亚洲国产精品va在线看黑人动漫| 国产精品一二区| 成人欧美一区二区三区黑人| 日本欧美中文字幕| 国产日韩欧美电影在线观看| 自拍亚洲一区欧美另类| 国产亚洲欧美日韩精品| 亚洲国产精品久久91精品| 久久精品小视频| 日韩av网站导航| 精品日韩美女的视频高清| 亚洲精品福利免费在线观看| 日韩电影大片中文字幕| 亚洲女人天堂色在线7777| 亚洲精品91美女久久久久久久| 精品国产999| 国产精品色午夜在线观看| 日本亚洲欧洲色α| 国产69精品久久久久久| 国产精品视频免费在线| 久久久精品一区二区| 日韩毛片中文字幕| 亚洲男人av在线| 国产日韩视频在线观看| 海角国产乱辈乱精品视频| 韩国国内大量揄拍精品视频| 亚洲人成在线一二| 欧美激情精品久久久久久黑人| 精品国内自产拍在线观看| 亚洲第一网站男人都懂| 久久最新资源网| 欧美日在线观看| 在线国产精品播放| 九九久久久久久久久激情| 国产精品久久久久久久久久| 国产精品27p| 亚洲女成人图区| 午夜精品视频在线| 久久久久久有精品国产| 国产视频亚洲视频| 久久精品国产2020观看福利| 欧美日韩成人黄色| 日韩视频永久免费观看| 精品福利免费观看| 亚洲精品美女视频| 国语自产精品视频在线看一大j8| 中文字幕av一区二区| 亚洲国产一区自拍| 欧美丰满少妇xxxx| 欧美成人高清视频| 国产欧美一区二区三区在线| 欧美国产日本高清在线| 亚洲男人天天操| 一个人看的www欧美| 欧美一级大片视频| 久久久精品视频成人| 精品欧美aⅴ在线网站| 亚洲白拍色综合图区| 久久亚洲精品一区| 欧美日本亚洲视频| 成人国产精品av| 搡老女人一区二区三区视频tv| 久久精品91久久久久久再现| 精品毛片网大全| 国产精品男人的天堂| 久久精品夜夜夜夜夜久久| 日韩精品日韩在线观看| 亚洲一级黄色av| 日韩中文字幕免费看| 668精品在线视频| 国产精品久久久久久亚洲调教| 亚洲乱亚洲乱妇无码| 久久久久国色av免费观看性色| 精品夜色国产国偷在线| 欧美精品一区二区三区国产精品| 欧洲精品毛片网站| 麻豆一区二区在线观看| 国产午夜精品一区二区三区| 不卡毛片在线看| 57pao成人国产永久免费| 亚洲欧美一区二区三区在线| 欧美日韩国产成人| 韩国美女主播一区| 亚洲一区二区三区在线免费观看| 神马久久桃色视频| 最近2019年好看中文字幕视频| 精品视频久久久久久| 国产精品欧美一区二区三区奶水| 成人激情黄色网| 自拍偷拍亚洲区| 亚洲天堂视频在线观看| 美日韩精品免费视频| 久久亚洲私人国产精品va| 国产亚洲人成a一在线v站| 亚洲图片在区色| 欧美性猛交xxxx乱大交3| 日韩一区二区三区在线播放| 国产日韩一区在线| 日韩电视剧在线观看免费网站| 97在线精品国自产拍中文| 555www成人网| 欧美华人在线视频| 日韩成人中文电影| 日韩国产精品一区| 久久99久久久久久久噜噜| 精品国产精品三级精品av网址|