这里介绍的是一种利用WebClient手动发送Stream到服务器页面的上传文件方法。

一、服务器接收文件

这里使用一个ASHX页面来接收和保存Silverlight传来的Stream,页面代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web; namespace Silverlight
{
/// <summary>
/// FileUploadHandler 的摘要说明
/// </summary>
public class FileUploadHandler : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
//获取上传参数 - 文件名
string fileName = context.Request["FileName"]; //获取上传的数据流
using (Stream inputStream = context.Request.InputStream)
{
try
{
//数据缓冲区
byte[] buffer = new byte[4096];
int bytesRead = 0; //准备保存路径和文件名
string filePath = string.Format(@"D:\FileUpload\"); //检查保存路径是否存在
if (!Directory.Exists(filePath))
{
//不存在进行创建
Directory.CreateDirectory(filePath);
} //准备写入文件流
using (FileStream fs = File.Create(filePath + fileName, 4096))
{
//开始循环写入文件
while ((bytesRead = inputStream.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);
}
}
} public bool IsReusable
{
get
{
return false;
}
}
}
}

这里保存文件的主要流程就是接收上传参数,准备保存文件,通过读取上传流保存文件内容。

二、客户端发送文件

客户端发送文件使用的是WebClient类。

首先建立一个WebClient连接:

//准备上传连接
WebClient uploadClient = new WebClient();
uploadClient.Headers["Content-Type"] = "multipart/form-data"; //连接打开后的操作
uploadClient.OpenWriteCompleted += uploadClient_OpenWriteCompleted;
//流写入完成后的操作
uploadClient.WriteStreamClosed += uploadClient_WriteStreamClosed; //打开上传连接
uploadClient.OpenWriteAsync(new Uri("", UriKind.Relative), "POST", fileStream);

WebClient打开连接后的处理:

void uploadClient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)
{
//将文件数据流发送到服务器上 // e.UserState - 需要上传的流(客户端流)
using (Stream clientStream = e.UserState as Stream)
{
// e.Result - 目标地址的流(服务端流)
using (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);
}
}
}
}

WebClient连接关闭后的处理:

void uploadClient_WriteStreamClosed(object sender, WriteStreamClosedEventArgs e)
{
//判断写入是否有异常
if (e.Error != null)
{
MessageBox.Show("上传失败!", e.Error.Message.ToString());
}
else
{
MessageBox.Show("上传成功!", "文件已保存!");
}
}

客户端这边主要就是打开连接,然后打开服务器的接收流,然后传输文件数据流到服务器。

Silverlight从客户端上传文件到服务器的更多相关文章

  1. 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子

    客户端:先创建一个winform窗体的应用程序项目 项目结构

  2. WPF上传文件到服务器

    利用WebClient 上传文件到服务器 创建一个空网站,创建一个UploadFile.aspx项, 服务器报500错误:检查文件保存路径是否存在,检查文件大小限制 protected void Pa ...

  3. Android上传文件至服务器(上)

    每一次都不能上首页,真悲催..管理员让我上一次首页? 很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构. 整洁的代码简单直接.整洁的代码如同优美的散文.整洁的代码从不隐藏设计者的 ...

  4. asp.net 客户端上传文件全路径获取方法

    asp.net  获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他 ...

  5. android上传文件到服务器

    package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...

  6. Android端通过HttpURLConnection上传文件到服务器

    Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...

  7. Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)

    1. 多个客户端上传到一个服务器的思考 通过while循环可以改进一个服务器接收多个客户端. 但是这个是有问题的.如果是这种情况,假设我还有张三,李四,王五这三个人分别执行客户端  张三:好好学习.a ...

  8. C 上传文件到服务器(含接收端源码)

    本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1067 实例向大家展示了如何用Visua ...

  9. joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸

    在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...

随机推荐

  1. 【Nodejs】理想论坛帖子下载爬虫1.04

    一直想做一个能把理想论坛指定页范围的帖子都能完整下载下来的爬虫,但未能如愿. 主要的障碍在并发数的控制和长时间任务的突然退出,比如想下载前五页的帖子,分析后可得到大约15000个主贴或子贴,如果用回调 ...

  2. 【C#】利用JMail发送邮件

    有用到需要发送帐号激活邮件,利用Jmail去做蛮简单的,先记录下: 1.首先到Jmail官网下载对应的版本,解压后安装(Jmail 4.4 免费版). 2.到安装目录就可以找到jmail.dll文件, ...

  3. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  4. JavaScript简述一

    一.什么时JavaScript JavaScript是一种具有面向对象能力的,解释型的设计语言,更具体一点,它是基于圣明和事件驱动并具有相对安全必的客户端脚本语言,因为它不需要在一个语言环境下运行,只 ...

  5. Linux RAID简介

    现代磁盘的缺陷:IO性能极弱,稳定性极差 RAID廉价磁盘冗余阵列:通过多磁盘并行运行来提高计算机的IO性能,在创建RAID时要求硬盘大小.品牌.型号一样 RAID可分为多种,称之为RAID级别,现代 ...

  6. CSS3 选择器浏览器兼容性汇总 IE8

    1.css选择器 css(包括css1.css2和css3)有哪些选择器? http://www.w3school.com.cn/cssref/css_selectors.asp 2.CSS3选择器 ...

  7. gdb 读取elf

    在make file中找到ld,然后将其换成 gdb, 如本例中LINKER = /usr/cygnus/xscale-020523/H-sparc-sun-solaris2.5/bin/xscale ...

  8. 〖Linux〗OK6410a蜂鸣器的驱动程序编写全程实录

    最近在看一本书,受益匪浅,作者是李宁,下边是编写本次蜂鸣器的全程实录: 1. 了解开发板中的蜂鸣器 1) 查看蜂鸣器buzzer在底板中的管脚信息 2) 查看蜂鸣器在总线中的信息 3) 翻看S3C64 ...

  9. 类的专有方法(__getattr__和__setattr__、__delattr__)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.360doc.com/content/15/0413/19/12067640_4629 ...

  10. 转:PHP关于反斜杠处理函数addslashes()和stripslashes()的用法

    1.php处理\函数:addslashes()和stripslashes()函数 addslashes():对输入字符串中的某些预定义字符前添加反斜杠,这样处理是为了数据库查询语句等的需要.这些预定义 ...