Silverlight从客户端上传文件到服务器
这里介绍的是一种利用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从客户端上传文件到服务器的更多相关文章
- 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子
客户端:先创建一个winform窗体的应用程序项目 项目结构
- WPF上传文件到服务器
利用WebClient 上传文件到服务器 创建一个空网站,创建一个UploadFile.aspx项, 服务器报500错误:检查文件保存路径是否存在,检查文件大小限制 protected void Pa ...
- Android上传文件至服务器(上)
每一次都不能上首页,真悲催..管理员让我上一次首页? 很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构. 整洁的代码简单直接.整洁的代码如同优美的散文.整洁的代码从不隐藏设计者的 ...
- asp.net 客户端上传文件全路径获取方法
asp.net 获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他 ...
- android上传文件到服务器
package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...
- Android端通过HttpURLConnection上传文件到服务器
Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...
- Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)
1. 多个客户端上传到一个服务器的思考 通过while循环可以改进一个服务器接收多个客户端. 但是这个是有问题的.如果是这种情况,假设我还有张三,李四,王五这三个人分别执行客户端 张三:好好学习.a ...
- C 上传文件到服务器(含接收端源码)
本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1067 实例向大家展示了如何用Visua ...
- joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸
在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...
随机推荐
- 线程池线程数与(CPU密集型任务和I/O密集型任务)的关系
近期看了一些JVM和并发编程的专栏,结合自身理解,来做一个关于(线程池线程数与(CPU密集型任务和I/O密集型任务)的关系)的总结: 1.任务类型举例: 1.1: CPU密集型: 例如,一般我们系统的 ...
- Shell程序荟萃
--------------纯输出----------------1.sh #!/bin/sh echo -e "Hello!world!\a\n"exit 0 --------- ...
- 。一个通俗易懂的HMM例子
原文链接地址:http://www.52nlp.cn/hmm-concrete-example-on-wiki/ Alice 和Bob是好朋友,但是他们离得比较远,每天都是通过电话了解对方那天作了什么 ...
- poj 2486 Apple Tree (树形背包dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: poj-2486 题意 给一个n个节点的树,节点编号为1~n, 根节点为1, 每个节点有一个权值. 从 ...
- PHP表单-PHP $_POST 变量
PHP $_POST 变量 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用 ...
- rpx单位与移动设备分辨率
移动设备的分辨率与rpx 不是所有的单位都适合用rpx 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- spring mvc中@requesMapping的可配置参数和标注的处理方法的可选参数
@RequestMapping的可选参数 value:表示需要匹配的url的格式. method:表示所需处理请求的http 协议(如get,post,put,delete等),可选值为Request ...
- 实战:INNOBACKUPEX for mysql 5.6自己主动备份脚本
#backup.sh #!/bin/sh # # 第一次运行它的时候它会检查是否有全然备份,否则先创建一个全库备份 # 当你再次执行它的时候.它会依据脚本中的设定来基于之前的全库备份进行增量备份 #o ...
- 赵雅智_android多线程下载带进度条
progressBar说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度. 一个进度条也可不确定其进度.在不确定模式下, ...
- PHP 与 UTF-8
没有一行式解决方案.小心.注意细节,以及一致性. PHP 中的 UTF-8 糟透了.原谅我的用词. 目前 PHP 在低层次上还不支持 Unicode.有几种方式可以确保 UTF-8 字符串能够被正确处 ...