Silverlight文件上傳下載實現(xiàn)方法(下載保存)
search了非常多的文章,總算勉強實現(xiàn)了。有許多不完善的地方。
在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; //因為要使用BitmapImage
using System.IO; //因為要使用Stream
namespace HCLoad
{
public partial class UC_UpDown : UserControl
{
//1、WebClient 對象一次只能啟動一個請求。如果在一個請求完成(包括出錯和取消)前,即IsBusy為true時,進行第二個請求,則第二個請求將會拋出 NotSupportedException 類型的異常
//2、如果 WebClient 對象的 BaseAddress 屬性不為空,則 BaseAddress 與 URI(相對地址) 組合在一起構(gòu)成絕對 URI
//3、WebClient 類的 AllowReadStreamBuffering 屬性:是否對從 Internet 資源接收的數(shù)據(jù)做緩沖處理。默認值為true,將數(shù)據(jù)緩存在客戶端內(nèi)存中,以便隨時被應用程序讀取
//獲取選定圖片信息
System.IO.FileInfo fileinfo;
public UC_UpDown()
{
InitializeComponent();
}
#region 下載圖片
private void btnDownload_Click(object sender, RoutedEventArgs e)
{
//向指定的Url發(fā)送下載流數(shù)據(jù)請求
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 - 該異步操作期間是否發(fā)生了錯誤
//OpenReadCompletedEventArgs.Cancelled - 該異步操作是否已被取消
//OpenReadCompletedEventArgs.Result - 下載后的 Stream 類型的數(shù)據(jù)
//OpenReadCompletedEventArgs.UserState - 用戶標識
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
return;
}
if (e.Cancelled != true)
{
//獲取下載的流數(shù)據(jù)(在此處是圖片數(shù)據(jù))并顯示在圖片控件中
//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 - 當前收到的字節(jié)數(shù)
//DownloadProgressChangedEventArgs.TotalBytesToReceive - 總共需要下載的字節(jié)數(shù)
//DownloadProgressChangedEventArgs.UserState - 用戶標識
this.tbMsgString.Text = string.Format("完成百分比:{0} 當前收到的字節(jié)數(shù):{1} 資料大小:{2} ",
e.ProgressPercentage.ToString() + "%",
e.BytesReceived.ToString(),
e.TotalBytesToReceive.ToString());
}
#endregion
#region 上傳圖片
private void btnUpLoad_Click(object sender, RoutedEventArgs e)
{
/**/
/*
* OpenWriteCompleted - 在打開用于上傳的流完成時(包括取消操作及有錯誤發(fā)生時)所觸發(fā)的事件
* WriteStreamClosed - 在寫入數(shù)據(jù)流的異步操作完成時(包括取消操作及有錯誤發(fā)生時)所觸發(fā)的事件
* UploadProgressChanged - 上傳數(shù)據(jù)過程中所觸發(fā)的事件。如果調(diào)用 OpenWriteAsync() 則不會觸發(fā)此事件
* Headers - 與請求相關(guān)的的標頭的 key/value 對**
* OpenWriteAsync(Uri address, string method, Object userToken) - 打開流以使用指定的方法向指定的 URI 寫入數(shù)據(jù)
* Uri address - 接收上傳數(shù)據(jù)的 URI
* string method - 所使用的 HTTP 方法(POST 或 GET)
* Object userToken - 需要上傳的數(shù)據(jù)流
*/
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)
{
//將圖片數(shù)據(jù)流發(fā)送到服務器上
// e.UserState - 需要上傳的流(客戶端流)
Stream clientStream = e.UserState as Stream;
// e.Result - 目標地址的流(服務端流)
Stream serverStream = e.Result;
byte[] buffer = new byte[4096];
int readcount = 0;
// clientStream.Read - 將需要上傳的流讀取到指定的字節(jié)數(shù)組中
while ((readcount = clientStream.Read(buffer, 0, buffer.Length)) > 0)
{
// serverStream.Write - 將指定的字節(jié)數(shù)組寫入到目標地址的流
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);
//通過調(diào)用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; //因為要用到Stream
namespace HCLoad.Web
{
public class WebClientUpLoadStreamHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//獲取上傳的數(shù)據(jù)流
string fileNameStr = context.Request.QueryString["fileName"];
Stream sr = context.Request.InputStream;
try
{
string filename = "";
filename = fileNameStr;
byte[] buffer = new byte[4096];
int bytesRead = 0;
//將當前數(shù)據(jù)流寫入服務器端文件夾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
上一篇:C#中比較常用的DateTime結(jié)構(gòu)的使用方法
欄 目:C#教程
本文標題:Silverlight文件上傳下載實現(xiàn)方法(下載保存)
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6869.html
您可能感興趣的文章


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子


