精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

分析Silverlight文件上傳組件

開(kāi)發(fā) 后端
文件上傳是日常開(kāi)過(guò)程中最常用的功能之一,我們今天一起看一下如何使用silverlight實(shí)現(xiàn)這個(gè)功能,而且功能和用戶體驗(yàn)相對(duì)會(huì)更好一些。

  文件上傳是日常開(kāi)過(guò)程中最常用的功能之一,目前實(shí)現(xiàn)文件上傳的方式多種多樣。這其中較為復(fù)雜的情況就是關(guān)于大文件、多文件上傳的問(wèn)題,目前解決大文件、多文件上傳一般借助于js或者flash組件,今天就同大家一起看一下如何使用silverlight實(shí)現(xiàn)這個(gè)功能,而且功能和用戶體驗(yàn)相對(duì)會(huì)更好一些。

  主要內(nèi)容:

  一、組件特點(diǎn)

  二、實(shí)現(xiàn)原理

  三、編碼實(shí)現(xiàn)

  一、組件特點(diǎn)

  對(duì)于今天要說(shuō)的組件姑且叫做"CmjUpload"吧,方便稱(chēng)呼。目前有很多上傳組件來(lái)輔助完成日常開(kāi)發(fā),"CmjUpload"有什么特點(diǎn)呢:

  解決大文件、多文件上傳問(wèn)題

  基于asp.net上傳,不需要部署WCF、WebService操作方便

  接口豐富、靈活性強(qiáng),配置使用方便。

  支持選擇、拖拽兩種文件添加方式上傳,用戶體驗(yàn)好。

  支持取消、暫停、繼續(xù)操作滿足續(xù)傳要求。

  OK,就說(shuō)那么多吧,主要是讓大家有興趣看下去,其實(shí)之所以有今天的話題主要還是為了學(xué)習(xí)以及滿足實(shí)際開(kāi)發(fā)需求。

  二、實(shí)現(xiàn)原理

  在Silverlight中要實(shí)現(xiàn)上傳有很多方式,例如說(shuō)使用WCF或者WebService,但是考慮到實(shí)際情況,這里沒(méi)有選擇以上兩種方式,而是選擇了WebRequest方式。原因比較簡(jiǎn)單,部署十分方便,不需要為了上傳組件而進(jìn)行額外的配置。Silverlight中使用WebRequest同其他.Net開(kāi)發(fā)中的使用方式是類(lèi)似的,不同的是Silverlight中很多操作都是異步的,當(dāng)然WebRequest也不例外。此外,在這里需要對(duì)一個(gè)文件分塊發(fā)送,一方面可以解決大文件上傳問(wèn)題,另一方面可以實(shí)時(shí)顯示文件上傳進(jìn)度。下面一個(gè)簡(jiǎn)單的交互過(guò)程:

  當(dāng)然要完成整個(gè)組件遠(yuǎn)不止上面說(shuō)的這些,UI的設(shè)計(jì),組件的本地化,用戶接口的設(shè)計(jì)等都是必須思考的問(wèn)題。下面是組件界面原型:

  界面分為兩個(gè)區(qū)域:文件顯示區(qū)域和操作區(qū)域,當(dāng)然這里的文件區(qū)域本身也是可以操作的,例如如果你不想點(diǎn)擊按鈕選擇文件的話,可以選擇直接拖拽一個(gè)或多個(gè)文件到文件區(qū)域。還可以對(duì)已添加的文件進(jìn)行刪除操作,對(duì)正在上傳的文件進(jìn)行暫停和續(xù)傳操作。此外文件區(qū)域的設(shè)計(jì)主要提供文件信息顯示,例如縮略圖、上傳進(jìn)度、文件名稱(chēng)、文件大小等信息。操作區(qū)域一方面提供文件整體信息的顯示(例如文件總數(shù)、已上傳數(shù)等),另一方面提供了文件瀏覽、上傳、清空操作。

  下面是類(lèi)的設(shè)計(jì):

在上圖中我們可以看出有三個(gè)包:Core、Config、Util。

  Core是核心包,里面主要包括文件隊(duì)列管理(FileQueue)、文件上傳控制(FileUpload)、文件界面區(qū)域(FileArea)、文件大小單位轉(zhuǎn)換(FileSize)、縮略圖控制(FileIcon)。

  Config是配置和接口包,主要包括組件設(shè)計(jì)級(jí)別常量(注意不是用戶級(jí)別也不是開(kāi)發(fā)級(jí)別,開(kāi)發(fā)級(jí)別配置在接口中進(jìn)行)(UploadConstant)、客戶端開(kāi)發(fā)接口(ExposeInterface)、本地化實(shí)現(xiàn)(Localization)、接口注冊(cè)(ClientInteraction)。

  Util包主要包括一些常用輔助類(lèi),主要包括xml操作(XmlHelper)、服務(wù)器端文件保存輔助類(lèi)(CmjUpload)。

  三、編碼實(shí)現(xiàn)

  有了上面的分析相信下面的實(shí)現(xiàn)就相當(dāng)容易理解了,首先看一下文件上傳類(lèi)FileUpload:

  using System;

  using System.Net;

  using System.Windows;

  using System.Windows.Controls;

  using System.Windows.Documents;

  using System.Windows.Ink;

  using System.Windows.Input;

  using System.Windows.Media;

  using System.Windows.Media.Animation;

  using System.Windows.Shapes;

  using System.Text;

  using System.IO;

  using System.Windows.Threading;

  using CmjUpload.Util;

  using CmjUpload.Config;

  namespace CmjUpload

  {

  public class FileUpload

  {

  //開(kāi)始上傳

  public delegate void StartUploadHanler(object sender,EventArgs e);

  public event StartUploadHanler StartUpload;

  public void OnStartUpload(object sender, EventArgs e)

  {

  if (StartUpload != null)

  {

  StartUpload(sender, e);

  }

  }

  // 上傳

  public delegate void UploadingHanler(object sender, ProgressArgs e);

  public event UploadingHanler Uploading;

  public void OnUploading(object sender, ProgressArgs e)

  {

  if (Uploading != null)

  {

  Uploading(sender,e);

  }

  }

  //上傳結(jié)束

  public delegate void UploadCompletedHanler(object sender, EventArgs e);

  public event UploadCompletedHanler UploadCompleted;

  public void OnUploadCompleted(object sender, EventArgs e)

  {

  if (UploadCompleted != null)

  {

  UploadCompleted(sender, e);

  }

  }

  private string _requestUrl = "";

  private string _fileName = "";

  private long _fileLength = 0;

  private long _blockLength = 4096;//單次上傳文件大小

  private long _postedLength = 0;//已傳輸文件大小

  private long _nextLength = 0;//下次傳輸?shù)奈募笮?/p>

  private bool _firstUpload = true;

  private BinaryReader _fileReader = null;

  private UploadStatus _uploadStatus = UploadStatus.Start;

  public FileInfo File

  {

  get;

  set;

  }

  //public long PostedLength

  //{

  // get

  // {

  // return _postedLength;

  // }

  // set

  // {

  // _postedLength = value;

  // }

  //}

  public UploadStatus Status

  {

  get

  {

  return _uploadStatus;

  }

  set

  {

  _uploadStatus = value;

  }

  }

  public void Upload(FileInfo file)

  {

  this.File = file;

  //XmlHelper xmlHelper = new XmlHelper("Config/CmjUploadConfig.xml");

  //_requestUrl=xmlHelper.GetAttibuteValue("Upload", "RequestUrl");

  _requestUrl = ExposeInterface.Instance().RequestUrl;

  this._fileName = this.File.Name;

  this._fileLength = this.File.Length;

  this._blockLength = FileSize.GetLockSize(this._fileLength);

  //this._postedLength = 0;

  _fileReader = new BinaryReader(file.OpenRead());

  //_uploadStatus = UploadStatus.Start;

  if (_fileLength <_blockLength)

  {

  _nextLength = _fileLength;

  }

  else

  {

  _nextLength = _blockLength;

  }

  OnStartUpload(this, new EventArgs());

  UploadInBlock();

  }

  public void UploadInBlock()//上傳一塊數(shù)據(jù)

  {

  UriBuilder uriBuilder = new UriBuilder(new Uri(_requestUrl, UriKind.Absolute));

  uriBuilder.Query = string.Format("fileName={0}&status="+_uploadStatus,this._fileName);

  WebRequest request = WebRequest.Create(uriBuilder.Uri);

  request.Method = "POST";

  request.ContentType = "multipart/mixed";//注意這里

  request.ContentLength = _nextLength;

  if (_firstUpload)

  {

  _uploadStatus = UploadStatus.Uploading;

  _firstUpload = false;

  }

  request.BeginGetRequestStream((IAsyncResult asyncResult) =>

  {

  WebRequest rqst = asyncResult.AsyncState as WebRequest;

  Stream rqstStm = rqst.EndGetRequestStream(asyncResult);

  byte[] buffer = new byte[_blockLength];

  int size = _fileReader.Read(buffer, 0, buffer.Length);

  if(size>0)

  {

  rqstStm.Write(buffer, 0, size);

  rqstStm.Flush();

  _postedLength += size;

  if ((_fileLength - _postedLength) <_blockLength)

  {

  _nextLength = _fileLength-_postedLength;

  }

  }

  rqstStm.Close();

  rqst.BeginGetResponse((IAsyncResult ascResult) =>//開(kāi)始數(shù)據(jù)傳輸

  {

  OnUploading(this, new ProgressArgs() { Percent = ((double)_postedLength / (double)_fileLength) });

  WebRequest webRequest = ascResult.AsyncState as WebRequest;

  WebResponse webResponse = (WebResponse)webRequest.EndGetResponse(ascResult);

  StreamReader reader = new StreamReader(webResponse.GetResponseStream());

  string responsestring = reader.ReadToEnd();

  reader.Close();

  if (_postedLength >= _fileLength)

  {

  _uploadStatus = UploadStatus.Complelte;

  }

  if (_uploadStatus == UploadStatus.Uploading)

  {

  UploadInBlock();

  }

  //else if(_uploadStatus==UploadStatus.Cancel)

  //{

  // return;

  //}

  else if (_uploadStatus==UploadStatus.Complelte)

  {

  _fileReader.Close();

  OnUploadCompleted(this, new EventArgs());

  }

  }, request);

  }, request);

  }

  /// <summary>

  /// 繼續(xù)上傳

  /// </summary>

  /// <param name="fileName"></param>

  /// <param name="uploadedLength"></param>

  //public static void ContinueUplaod(string fileName,long uploadedLength)

  //{

  //}

  }

  //上傳進(jìn)度參數(shù)

  public class ProgressArgs:EventArgs

  {

  public double Percent

  {

  get;

  set;

  }

  }

  public enum UploadStatus

  {

  Start,

  Uploading,

  Cancel,

  Complelte

  }

  }

  在這個(gè)類(lèi)中需要注意的是狀態(tài)的控制,因?yàn)榻M件需要實(shí)現(xiàn)文件暫停、續(xù)傳功能,并且每次請(qǐng)求時(shí)需要發(fā)送相應(yīng)的操作狀態(tài);另一點(diǎn)就是對(duì)外公開(kāi)了三個(gè)事件,用于給UI提供進(jìn)度支持和狀態(tài)通知。

  FileQueue管理整個(gè)文件隊(duì)列,控制著界面UI、文件上傳等信息:

  using System;

  using System.Collections.Generic;

  using System.IO;

  namespace CmjUpload

  {

  /// <summary>

  /// 文件隊(duì)列管理者

  /// </summary>

  public class FileQueue

  {

  private static object _lock = new object();

  private static FileQueue _fileQueue = null;

  private Dictionary<string, int> _fileIndexs = null;//文件同索引對(duì)應(yīng)關(guān)系

  private Dictionary<string,FileInfo> _files = null;

  private Dictionary<string,FileArea> _fileAeas = null;

  private Dictionary<string, FileUpload> _fileUploader = null;

  private int index = 0;

  private FileQueue()

  {

  _fileIndexs = new Dictionary<string, int>();

  _files = new Dictionary<string, FileInfo>();

  _fileAeas = new Dictionary<string, FileArea>();

  _fileUploader = new Dictionary<string, FileUpload>();

  }

  public static FileQueue Instance()

  {

  lock (_lock)

  {

  if (_fileQueue == null)

  {

  _fileQueue = new FileQueue();

  }

  }

  return _fileQueue;

  }

  public void Add(FileInfo file)

  {

  _fileIndexs.Add(file.Name, index);

  _files.Add(file.Name,file);

  FileArea fileAerea = new FileArea(file);

  _fileAeas.Add(file.Name, fileAerea);

  ++index;

  }

  public void Remove(string fileName)

  {

  _fileIndexs.Remove(fileName);

  _files.Remove(fileName);

  _fileAeas.Remove(fileName);

  _fileUploader.Remove(fileName);

  }

  public Dictionary<string,FileInfo> Files

  {

  get

  {

  return _files;

  }

  set

  {

  _files = value;

  }

  }

  public Dictionary<string, FileArea> FileAreas

  {

  get

  {

  return _fileAeas;

  }

  set

  {

  _fileAeas = value;

  }

  }

  public Dictionary<string, FileUpload> FileUploader

  {

  get

  {

  return _fileUploader;

  }

  set

  {

  _fileUploader = value;

  }

  }

  public int GetFileIndex(string fileName)

  {

  int i=-1;

  if (_fileIndexs.ContainsKey(fileName))

  {

  i = _fileIndexs[fileName];

  }

  return i;

  }

  public void Clear()

  {

  string[] tempFileNames=new string[this.Files.Count];

  this.Files.Keys.CopyTo(tempFileNames,0);

  foreach (string fileName in tempFileNames)

  {

  this.Remove(fileName);

  }

  }

  }

  }

  FileArea用于構(gòu)建每個(gè)文件的UI展示:

  using System;

  using System.Net;

  using System.Windows;

  using System.Windows.Controls;

  using System.Windows.Documents;

  using System.Windows.Ink;

  using System.Windows.Input;

  using System.Windows.Media;

  using System.Windows.Media.Animation;

  using System.Windows.Shapes;

  using System.Windows.Media.Imaging;

  using System.IO;

  using Cmj.MyWeb.MySilverlight.MyUserControl.Button;

  namespace CmjUpload

  {

  public class FileArea

  {

  private FileInfo _file = null;

  //private int _number = 0;

  private Grid _container = null;

  private TextBlock _name = null;

  private Image _thumnail = null;

  private ProgressBar _progress = null;

  private TextBlock _size = null;

  private TextBlock _percent = null;

  private Cancel _cancel = null;

  private Pause _pause = null;

  private Play _continue = null;

  private Check _complete = null;

  public FileArea(FileInfo file)

  {

  _file = file;

  //_number = number;

  _container = new Grid();

  _container.Name = "fileArea_container_" + file.Name;

  _container.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(60)});

  _container.ColumnDefinitions.Add(new ColumnDefinition());

  _container.ColumnDefinitions.Add(new ColumnDefinition() { Width=new GridLength(60)});

  _container.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(60) });

  _container.Height = 50;

  _thumnail = new Image();

  _thumnail.Name = "fileArea_thumnail_" + file.Name;

  _thumnail.Height = 40;

  _thumnail.Source = FileIcon.Instance().GetThumbnailImage(file);

  _thumnail.VerticalAlignment = VerticalAlignment.Bottom;

  _thumnail.HorizontalAlignment = HorizontalAlignment.Center;

  Grid.SetColumn(_thumnail, 0);

  _progress = new ProgressBar();

  _progress.Name = "fileArea_progress_" + file.Name;

  _progress.Minimum = 0;

  _progress.Maximum = 100;

  _progress.Value = 0;

  _progress.Height = 20;

  _progress.VerticalAlignment = VerticalAlignment.Bottom;

  //_progress.HorizontalAlignment = HorizontalAlignment.Center;

  Grid.SetColumn(_progress, 1);

  _name = new TextBlock();

  _name.Name = "fileArea_name_" + file.Name;

  _name.Text = file.Name;

  _name.VerticalAlignment = VerticalAlignment.Bottom;

  _name.HorizontalAlignment = HorizontalAlignment.Left;

  _name.Margin = new Thickness(10, 0, 0, 2);

  Grid.SetColumn(_name, 1);

  _percent = new TextBlock();

  _percent.Name = "fileArea_percent_" + file.Name;

  _percent.VerticalAlignment = VerticalAlignment.Bottom;

  _percent.HorizontalAlignment = HorizontalAlignment.Right;

  _percent.Margin = new Thickness(0, 0, 10, 2);

  Grid.SetColumn(_percent, 1);

  _size = new TextBlock();

  _size.Name = "fileArea_size_" + file.Name;

  _size.VerticalAlignment = VerticalAlignment.Bottom;

  _size.HorizontalAlignment = HorizontalAlignment.Right;

  Grid.SetColumn(_size, 2);

  _cancel = new Cancel();

  _cancel.Name = "fileArea_cancel_"+file.Name;

  _cancel.Width = 15;

  _cancel.Height = 15;

  _cancel.VerticalAlignment = VerticalAlignment.Bottom;

  //_cancel.Click += new RoutedEventHandler(_cancel_Click);

  Grid.SetColumn(_cancel, 3);

  _pause = new Pause();

  _pause.Name = "fileArea_pause_" + file.Name;

  _pause.Width = 15;

  _pause.Height = 15;

  _pause.VerticalAlignment = VerticalAlignment.Bottom;

  _pause.Visibility = Visibility.Collapsed;

  Grid.SetColumn(_pause, 3);

  _continue = new Play();

  _continue.Name = "fileArea_continue_" + file.Name;

  _continue.Width = 15;

  _continue.Height = 15;

  _continue.VerticalAlignment = VerticalAlignment.Bottom;

  _continue.Visibility = Visibility.Collapsed;

  Grid.SetColumn(_continue, 3);

  _complete = new Check();

  _complete.Name = "fileArea_complete_" + file.Name;

  _complete.Width = 18;

  _complete.Height = 18;

  _complete.VerticalAlignment = VerticalAlignment.Bottom;

  _complete.Visibility = Visibility.Collapsed;

  Grid.SetColumn(_complete, 3);

  _container.Children.Add(_thumnail);

  _container.Children.Add(_progress);

  _container.Children.Add(_size);

  _container.Children.Add(_name);

  _container.Children.Add(_percent);

  _container.Children.Add(_cancel);

  _container.Children.Add(_pause);

  _container.Children.Add(_continue);

  _container.Children.Add(_complete);

  }

  public Grid Container

  {

  get

  {

  return _container;

  }

  set

  {

  _container = value;

  }

  }

  public TextBlock Name

  {

  get

  {

  return _name;

  }

  set

  {

  _name = value;

  }

  }

  public Image Thumnail

  {

  get

  {

  return _thumnail;

  }

  set

  {

  _thumnail = value;

  }

  }

  public ProgressBar Progress

  {

  get

  {

  return _progress;

  }

  set

  {

  _progress = value;

  }

  }

  public TextBlock Size

  {

  get

  {

  return _size;

  }

  set

  {

  _size = value;

  }

  }

  public TextBlock Percent

  {

  get

  {

  return _percent;

  }

  set

  {

  _percent = value;

  }

  }

  public Cancel Cancel

  {

  get

  {

  return _cancel;

  }

  set

  {

  _cancel = value;

  }

  }

  public Pause Pause

  {

  get

  {

  return _pause;

  }

  set

  {

  _pause = value;

  }

  }

  public Play Continue

  {

  get

  {

  return _continue;

  }

  set

  {

  _continue = value;

  }

  }

  public Check Complete

  {

  get

  {

  return _complete;

  }

  set

  {

  _complete = value;

  }

  }

  }

  }

  ExposeInterface用于向客戶端調(diào)用提供操作接口:

  using System;

  using System.Net;

  using System.Windows;

  using System.Windows.Controls;

  using System.Windows.Documents;

  using System.Windows.Ink;

  using System.Windows.Input;

  using System.Windows.Media;

  using System.Windows.Media.Animation;

  using System.Windows.Shapes;

  using System.Collections.Generic;

  using System.Windows.Browser;

  namespace CmjUpload.Config

  {

  public class ExposeInterface

  {

  private static object _lock = new object();

  private static ExposeInterface _exposeInterface = null;

  private string _fileTypes = string.Empty;

  private string _fileDialogFilter = string.Empty;

  private long _limitSize = 0;

  private int _limitCount = 0;

  private ExposeInterface()

  {

  }

  public static ExposeInterface Instance()

  {

  lock (_lock)

  {

  if (_exposeInterface == null)

  {

  _exposeInterface = new ExposeInterface();

  }

  }

  return _exposeInterface;

  }

  [ScriptableMember]

  public string FileTypes //ex:*.jpg|*.gif

  {

  get

  {

  return _fileTypes;

  }

  set

  {

  _fileTypes = value;

  }

  }

  [ScriptableMember]

  public string FileDialogFilter

  {

  get

  {

  if (this._fileDialogFilter == string.Empty&&this._fileTypes!=string.Empty)

  {

  string[] types = this._fileTypes.Split('|');

  string[] filters=new string[types.Length];

  for(int i=0;i<types.Length;++i)

  {

  filters[i] = "("+types[i] +")|"+ types[i];

  }

  _fileDialogFilter = string.Join("|",filters);

  }

  return _fileDialogFilter;

  }

  set

  {

  _fileDialogFilter = value;

  }

  }

  [ScriptableMember]

  public long LimitSize//單位 MB

  {

  get

  {

  return _limitSize;

  }

  set

  {

  _limitSize = value;

  }

  }

  [ScriptableMember]

  public int LimitCount

  {

  get

  {

  return _limitCount;

  }

  set

  {

  _limitCount = value;

  }

  }

  [ScriptableMember]

  public string RequestUrl

  {

  get;

  set;

  }

  public List<string> GetFileExtensions()

  {

  List<string> extensions = new List<string>();

  string[] types = this._fileTypes.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);

  foreach(string type in types)

  {

  extensions.Add(type.TrimStart('*'));

  }

  return extensions;

  }

  }

  }

  CmjUpload用于提供給服務(wù)器端進(jìn)行文件操作,服務(wù)端只需要簡(jiǎn)單調(diào)用其Save方法就可以進(jìn)行文件保存:

  using System;

  using System.Collections.Generic;

  using System.Web;

  using System.IO;

  namespace CmjUpload.Web.Util

  {

  public class CmjUpload

  {

  public static void Save(string relationPath)

  {

  string fileName = HttpContext.Current.Request["fileName"];

  Save(relationPath,fileName);

  }

  public static void Save(string relationPath,string outputName)

  {

  string status = HttpContext.Current.Request["status"];

  if (status == "Start")

  {

  using (FileStream fs = File.Create(Path.Combine(relationPath, outputName)))

  {

  SaveFile(HttpContext.Current.Request.InputStream, fs);

  }

  }

  else if (status == "Uploading")

  {

  using (FileStream fs = File.Open(Path.Combine(relationPath, outputName), FileMode.Append))

  {

  SaveFile(HttpContext.Current.Request.InputStream, fs);

  }

  }

  else if (status == "Completed")

  {

  HttpContext.Current.Response.Write("{success:true}");

  }

  }

  private static void SaveFile(Stream stream, FileStream fs)

  {

  byte[] buffer = new byte[4096];

  int bytesRead;

  while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)

  {

  fs.Write(buffer, 0, bytesRead);

  }

  }

  }

  }

  OK,其他的代碼就不再貼出了,看一下客戶端如何使用吧。

  為了方便使用客戶端提供一個(gè)公用js類(lèi)CmjUpload.js:

  //注意要在控件加載完之后調(diào)用,建議放到插件onload事件中初始化(<param name="onLoad" value="pluginLoaded" />)

  var CmjUpload = function (options) {

  var uploader = null;

  if (options.hasOwnProperty("id")) {//組件id

  uploader = document.getElementById(options.id);

  } else {

  alert("Please configure the id attribute before use CmjUpload component!");

  return;

  }

  if (options.hasOwnProperty("requestUrl")) {//請(qǐng)求的url

  uploader.content.cmjUpload.RequestUrl = options.requestUrl;

  } else {

  alert("Please configure the requestUrl attribute before use CmjUpload component!");

  return;

  }

  if (options.hasOwnProperty("fileTypes")) {//文件類(lèi)型限制

  uploader.content.cmjUpload.FileTypes = options.fileTypes;

  }

  if (options.hasOwnProperty("limitCount")) {//每批次上傳的文件數(shù)

  uploader.content.cmjUpload.LimitCount = options.limitCount;

  }

  if (options.hasOwnProperty("limitSize")) {//單個(gè)文件大小限制

  uploader.content.cmjUpload.LimitSize = options.limitSize;

  }

  }

  CmjUpload.prototype.onBeforeFileUpload = function () {//單個(gè)文件上傳之前執(zhí)行

  }

  CmjUpload.prototype.onFileUploading = function () { //單個(gè)文件上傳時(shí)執(zhí)行

  }

  CmjUpload.prototype.onFileUploaded = function () {//單個(gè)文件上傳完畢執(zhí)行

  }

  CmjUpload.prototype.onBatchUploaded = function () {//整個(gè)批次的文件上傳完畢執(zhí)行

  }

  然后在頁(yè)面添加上傳組件(本地化語(yǔ)言在param中進(jìn)行配置):

  <object id="cmjUpload1" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">

  <param name="source" value="ClientBin/CmjUpload.xap"/>

  <param name="onError" value="onSilverlightError" />

  <param name="onLoad" value="pluginLoaded" /><!--注意這里,必須保證配置信息在頁(yè)面加載之后執(zhí)行-->

  <param name="culture" value="en-US" /><!--注意這里本地化配置-->

  <param name="uiculture" value="en-US" /><!--注意這里本地化配置-->

  <param name="background" value="white" />

  <param name="minRuntimeVersion" value="4.0.50826.0" />

  <param name="autoUpgrade" value="true" />

  <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration:none">

<img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>

</a>

  </object>

  使用時(shí)在頁(yè)面引用該類(lèi),進(jìn)行id和url等信息配置,具體的配置內(nèi)容上面js已經(jīng)注釋的很清楚,這里不再贅余。例如對(duì)頁(yè)面做如下配置:

  pluginLoaded=function(){

  var upload = new CmjUpload({ id: 'cmjUpload1', requestUrl: 'http://localhost:3407/Upload.aspx', fileTypes: '*.jpg|*.png|*.wmv|*.rar|*.iso', limitCount: 5, limitSize: 150 });

  }

  后臺(tái)文件執(zhí)行文件保存操作:

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Web;

  using System.Web.UI;

  using System.Web.UI.WebControls;

  using System.IO;

  namespace CmjUpload.Web

  {

  public partial class Upload : System.Web.UI.Page

  {

  protected void Page_Load(object sender, EventArgs e)

  {

  CmjUpload.Web.Util.CmjUpload.Save("f:\");

  }

  }

  }

  下面是使用效果:

  類(lèi)型限制

大小限制

數(shù)量限制

刪除一個(gè)文件

上傳中

上傳暫停

完成上傳

  手動(dòng)清空(即使不手動(dòng)清空繼續(xù)上傳文件會(huì)自動(dòng)清空,清空操作主要用于上傳暫停后不需要上傳的清空)

下面看看本地化設(shè)置為英文后的效果

  我們通過(guò)修改LimitCount來(lái)看一下大文件傳輸,好幾個(gè)G的文件同時(shí)傳輸也沒(méi)有問(wèn)題

  OK,***附上組件下載,使用方法上面說(shuō)的也比較清楚了。關(guān)于組件源代碼就不再提供下載了,相信讀完這篇文章要實(shí)現(xiàn)并不難,真正需要的話可以給我留言或發(fā)郵件KenshinCui@hotmail.com。

  組件下載

  本作品采用知識(shí)共享署名 2.5 中國(guó)大陸許可協(xié)議進(jìn)行許可,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的。但轉(zhuǎn)載請(qǐng)注明來(lái)自崔江濤(KenshinCui),并包含相關(guān)鏈接。

【編輯推薦】

  1. Silverlight***動(dòng)態(tài)和未來(lái)前景
  2. 微軟正式發(fā)布Silverlight 5
  3. 微軟能否撐起Silverlight的明天?
  4. 基于Silverlight的網(wǎng)絡(luò)操作系統(tǒng)SilveOS
  5. Silverlight企業(yè)應(yīng)用開(kāi)發(fā)實(shí)踐之AgileEAS.NET
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-09-22 16:14:41

ViewBox組件

2009-12-29 16:21:46

silverlight

2009-07-02 13:31:13

JSP組件

2009-12-29 16:36:47

Silverlight

2009-12-31 17:31:23

Silverlight

2010-01-04 15:34:18

2009-12-31 15:01:07

Silverlight

2009-11-16 10:16:24

PHP文件上傳

2009-04-03 13:09:12

Windows Emb

2009-12-31 16:50:02

Silverlight

2009-12-30 09:38:37

Silverlight

2010-01-04 16:38:07

企業(yè)級(jí)Silverli

2009-12-30 16:37:42

Silverlight

2010-01-04 10:34:01

Silverlight

2012-03-27 11:08:23

Java

2009-03-16 10:00:01

文件同步LivemeshSilverlight

2016-12-15 08:28:34

HttpURLConn上傳文件

2021-03-04 08:33:20

JavaScript 前端原生js

2009-05-11 09:15:53

微軟SilverlightFlash

2009-12-31 13:45:13

Silverlight
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲人成五月天| 亚洲色图一区二区| 日韩av电影中文字幕| 欧洲女同同性吃奶| 国产91精品在线| 亚洲免费观看在线视频| 国产欧美一区二区视频| 亚洲精品国产精品乱码视色| 亚洲乱码精品| 亚洲国产精品va在看黑人| 50路60路老熟妇啪啪| 天堂资源在线中文| 成人h精品动漫一区二区三区| 日韩在线观看免费网站| 6080国产精品| 24小时免费看片在线观看| heyzo一本久久综合| 国产99视频精品免视看7| 性色国产成人久久久精品| 亚洲伦理网站| 香蕉久久一区二区不卡无毒影院| 国产偷久久久精品专区| 波多野结衣在线观看一区| 色综合天天爱| 亚洲精品电影在线| 国产九九热视频| 黄页网站在线| 国产日韩成人精品| 懂色一区二区三区av片| 亚洲va在线观看| 欧美国产91| 亚洲视频在线视频| 久久久久无码精品| 伊人成综合网站| 综合在线观看色| 免费看国产精品一二区视频| 国产又粗又大又黄| 国产日韩欧美一区在线| yw.139尤物在线精品视频| 国产精品无码电影| 粉嫩av国产一区二区三区| 婷婷激情综合网| 亚洲国产精品久久久久久女王| 国产乱淫av免费| 丝瓜av网站精品一区二区| 欧美另类69精品久久久久9999| 精品久久久久久中文字幕人妻最新| 91精品一区| 色婷婷久久99综合精品jk白丝| 激情视频小说图片| 91精品国产综合久久久久久豆腐| 成人一区在线观看| 91精品免费| 91精东传媒理伦片在线观看| 免费国产自线拍一欧美视频| 久久6免费高清热精品| 亚洲自拍偷拍图| 天堂网av成人| 亚洲激情在线视频| 一级全黄裸体片| 国产精品毛片aⅴ一区二区三区| 色天天综合久久久久综合片| 欧洲精品一区二区三区久久| 看女生喷水的网站在线观看| 国产精品卡一卡二卡三| 色综合视频二区偷拍在线| 奇米影视888狠狠狠777不卡| 99久久综合国产精品| 97超碰人人看人人| 国产免费叼嘿网站免费| 美女视频一区二区| 国产精品扒开腿做| 精品成人无码久久久久久| 亚洲国产片色| 高清欧美性猛交xxxx| 免费在线一区二区三区| 你懂的成人av| 久久综合伊人77777尤物| 午夜爱爱毛片xxxx视频免费看| 日本黄色精品| 中文字幕精品—区二区| 超碰人人干人人| 国产精品国产一区| 中文字幕精品一区二区精品| 一二三不卡视频| 里番精品3d一二三区| 精品福利一二区| v天堂中文在线| 亚洲精品蜜桃乱晃| 亚洲网站在线看| 又色又爽的视频| 91精品国产乱码久久久久久| 欧美日本高清一区| 一级aaa毛片| 性8sex亚洲区入口| 日产精品99久久久久久| 中文字幕+乱码+中文| 精彩视频一区二区三区| 92国产精品久久久久首页| 性色av蜜臀av| 91久色porny| 日韩成人av电影在线| 欧美69xxxxx| 久久精品网站免费观看| 污视频在线免费观看一区二区三区| 番号集在线观看| 亚洲欧洲精品成人久久奇米网| 麻豆md0077饥渴少妇| 日韩成人伦理| 日韩欧美aaa| 国产精品入口免费软件| 91精品麻豆| 精品久久久久久久久久久久久久久久久 | 成人免费视频毛片| 欧美aaaaaa午夜精品| 91大片在线观看| 午夜在线视频观看| 国产精品久久久久久久久久免费看| 欧美黄网在线观看| 日本成人福利| 亚洲精品国产精品国自产观看浪潮| 国产一区二区三区精品在线| 亚洲成av人电影| 国产成人久久精品| 精品人妻少妇AV无码专区| 91免费看片在线观看| 中国 免费 av| 亚洲精品一级二级| 精品久久免费看| 中文天堂资源在线| 亚洲免费婷婷| 国产精品国产亚洲精品看不卡15| 青青色在线视频| 综合电影一区二区三区| 久久久999视频| 精品一区二区三区中文字幕 | 男人搞女人网站| 国产成人夜色高潮福利影视| 日韩一区二区福利| 中文字幕日韩免费| 95精品视频在线| 久操手机在线视频| 欧美黑粗硬大| 亚洲欧洲日本专区| 国产精品theporn动漫| 久久99精品国产麻豆婷婷| 久久亚洲高清| 成全电影大全在线观看| 欧美日韩精品一区视频| 男女一区二区三区| 亚洲欧美综合| 国产精品永久免费| 天天综合永久入口| 亚洲综合区在线| 日本美女视频一区| 精品国产一区探花在线观看| 欧美成人激情视频免费观看| 99久久精品国产成人一区二区 | 日韩欧美在线看| 国产黄色三级网站| 日韩视频在线一区二区三区| 999国内精品视频在线| 免费av网站在线观看| 欧美日韩另类一区| 午夜激情视频在线播放| 日韩不卡一二三区| 视频一区视频二区视频| 欧美中文字幕精在线不卡| 亚洲免费视频一区二区| 草久久免费视频| 91蜜桃在线免费视频| 欧美 日韩 亚洲 一区| 牛牛精品成人免费视频| 97久久精品国产| 日本不卡免费播放| 日韩欧美中文字幕在线观看| 泷泽萝拉在线播放| 青娱乐精品视频| 久久人人九九| 日本在线啊啊| 色妞一区二区三区| 国产三级在线观看视频| 一个色妞综合视频在线观看| 精品国产乱码久久久久夜深人妻| 在线免费高清一区二区三区| 精品日韩欧美| 欧美福利在线播放| 日韩一区二区久久久| www日本高清| 午夜激情久久久| 亚洲第一成人网站| 免费成人性网站| 影音先锋成人资源网站| 国产精品美女在线观看直播| 97视频国产在线| 九色视频在线观看免费播放| 欧美三级乱人伦电影| 国精品无码一区二区三区| 成人亚洲精品久久久久软件| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 国产一区三区在线播放| 91久久久在线| 大菠萝精品导航| 国产亚洲精品一区二区| 国产精品人人妻人人爽| 亚洲制服丝袜在线| 中文字幕网站在线观看| 国产乱淫av一区二区三区| 免费av观看网址| 91视频一区| 精品伦精品一区二区三区视频| 亚洲成人短视频| 欧美成人手机在线| 黄色片在线免费看| 在线不卡a资源高清| 久热这里只有精品6| 国产精品欧美久久久久无广告| wwwww在线观看| 日本一不卡视频| www.好吊操| 久久中文字幕av| 久久久福利视频| 亚洲五码在线| 国产男人精品视频| 中文字幕在线视频久| 久久久精品国产| 黄色在线播放| 精品国产三级a在线观看| 日本妇乱大交xxxxx| 五月婷婷另类国产| 午夜爽爽爽男女免费观看| 成人午夜av电影| 中文字幕一区二区三区四| 久久精品导航| 久久国产午夜精品理论片最新版本| 日韩欧美一区免费| 久久久久久久久久久久久9999| 亚洲精品tv| 国产精品久久久久久久久久小说 | 精品视频在线观看免费观看| 国产精品第一区| 97天天综合网| 久久久国产一区二区三区| 国产视频福利在线| 日韩电影免费在线观看中文字幕| av在线免费在线观看| 精品视频1区2区3区| 黄色污污网站在线观看| 五月婷婷激情综合| 久久久久久久九九九九| 亚洲天堂中文字幕| 精品国产国产综合精品| 国产网站一区二区| 免费在线观看你懂的| av电影在线观看不卡| 中国免费黄色片| 成人性生交大片免费看视频在线 | 一区二区国产精品精华液| 国产精品色在线| 欧美三级视频网站| 国产欧美日韩在线| 少妇人妻好深好紧精品无码| 久久综合九色欧美综合狠狠| 给我免费观看片在线电影的| 成人福利视频网站| 三级视频网站在线观看| 成人18精品视频| 久久久久成人精品无码中文字幕| 久久精品久久99精品久久| 欧美激情成人网| 久久久久久一区二区| 亚洲自偷自拍熟女另类| 99在线精品免费视频九九视| 久久久久久久久久久久久国产精品 | 日韩免费观看高清| 第四色男人最爱上成人网| 国产成人精品免费视频| 国产私拍福利精品视频二区| 国产精品视频导航| 国产精久久一区二区| www国产亚洲精品| 国产精品对白| 欧美大香线蕉线伊人久久国产精品 | 色综合久久久久综合体| 老熟妇一区二区三区| 欧美视频第二页| 国产精品伦理一区| 欧美岛国在线观看| 丝袜视频国产在线播放| 国产一区二区三区欧美| 欧美精品电影| 久久人人爽人人爽人人片av高请| 国产资源在线观看入口av| 日本成熟性欧美| 日韩欧乱色一区二区三区在线| 91嫩草国产在线观看| 神马久久影院| 一区二区三区免费看| 国产精品第十页| 波多野结衣作品集| 国产一区二三区| 国产精品一级黄片| 欧美激情自拍偷拍| 欧美精品入口蜜桃| 欧美日韩一区二区三区| 91久久久久国产一区二区| 欧美精品一区二区三区很污很色的| 日韩av视屏| 欧美大尺度激情区在线播放| 国产日韩电影| 91在线高清视频| 四虎5151久久欧美毛片| 特级黄色录像片| 久久精品男女| www.17c.com喷水少妇| 国产精品免费视频一区| 日韩美女一级片| 欧美日韩国产片| 亚洲av毛片成人精品| 久久久91精品国产| 男人皇宫亚洲男人2020| 国产精品中文在线| 久久动漫网址| 亚洲成人精品电影在线观看| 亚洲国产精品久久久天堂| 久艹视频在线免费观看| 久久99精品国产91久久来源| 制服丝袜在线第一页| 国产精品丝袜一区| 日本网站在线免费观看| 欧美日韩电影一区| 天天操天天操天天干| 欧美成人一区在线| 搜成人激情视频| 国产精品三区在线| 天天综合精品| 美女网站免费观看视频| 国产一区二区女| 国产精品一区二区亚洲| 欧美日韩中文字幕在线视频| 亚洲av无码国产精品永久一区 | av午夜在线| 日本a级片电影一区二区| 久久狠狠久久| 久久久99精品视频| 久久精品国产亚洲高清剧情介绍| 亚洲一区在线不卡| 久久久久综合网| 日批视频免费在线观看| 欧美一区二区在线播放| 国产福利在线| 国产精品91久久久| 国产成人影院| 茄子视频成人免费观看| 99久久免费国产| 国产在线观看免费av| 日韩精品综合一本久道在线视频| 欧美一区二区三区| 国产日韩中文字幕| 久久久久免费av| 在线观看中文av| 综合精品久久久| 精品美女www爽爽爽视频| 久久av.com| 亚洲国产视频二区| 欧美交换配乱吟粗大25p| 韩国视频一区二区| 国产盗摄一区二区三区在线| 4438x亚洲最大成人网| 国产网友自拍视频导航网站在线观看 | 成人在线视频免费播放| 午夜精品久久久久久久蜜桃app | 蜜桃久久av| 久久精品国产亚洲av久| 色综合久久66| 国产高清视频在线观看| 国产精品一区二区女厕厕| 91亚洲国产成人久久精品| 欧美国产日韩在线视频| 亚洲一区二区视频| 午夜小视频在线播放| 国内精品久久久久久久久| 欧亚精品一区| 欧美激情视频免费看| 9久草视频在线视频精品| 韩国av中文字幕| 亚洲色图综合网| 色成人综合网| www成人免费| 91免费国产在线观看| 美女又爽又黄免费视频| 日韩在线观看网站| 红杏aⅴ成人免费视频| 少妇性l交大片| 亚洲色图清纯唯美| 婷婷开心激情网| 国产成人精品一区二区在线| 国产精品久久久乱弄| 日本精品一二三| 日本高清无吗v一区|