利用HttpWebRequest实现实体对象的上传
一 简介
HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择。它们支持一系列有用的属性。这两个类位 于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的。请注意,HttpWebRequest对象不是利用new关键字通过构 造函数来创建的,而是利用工厂机制(factory mechanism)通过Create()方法来创建的。另外,你可能预计需要显式地调用一个“Send”方法,实际上不需要。接下来调用 HttpWebRequest.GetResponse()方法返回的是一个HttpWebResponse对象。你可以把HTTP响应的数据流 (stream)绑定到一个StreamReader对象,然后就可以通过ReadToEnd()方法把整个HTTP响应作为一个字符串取回。也可以通过 StreamReader.ReadLine()方法逐行取回HTTP响应的内容。
二 场景
就像上面所说的那样这两个对象的传输都是以流的方式在网络中传输的,如果我想要从客户端向服务器发送一个实体对象的数据该怎么解决呢?可能有的人说使用wcf等通信技术,但是对于我的应用场景来说有点小题大做,于是在网上找了点资料,实现了基于HttpWebReques的数据对象的传输。
三 具体实现
首先,创建需要传输的实体类PostParameters,这个实体类中有两个属性,一个是要传输的文件的文件流,另一个是文件路径(当然,因为我的需求是要上传图片的,没有做过多的扩展,后缀名,文件格式等的需求,可以根据自己的需求去做扩展)
public class PostParameters
{
// public string Name { get; set; }
public Stream FStream { get; set; }
public string Path { get; set; }
}
下面是客户端的代码,利用HttpWebRequest传输实体对象数据
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using Newtonsoft.Json; namespace AshxRequestTest
{
internal class Program
{
private static void Main(string[] args)
{
PostJson("http://uploadimg.zhtx.com/UploadImagHandle.ashx", new PostParameters
{
Path = "hahah"
});
} private static void PostJson(string uri, PostParameters postParameters)
{
string postData = JsonConvert.SerializeObject(postParameters); //将对象序列化
byte[] bytes = Encoding.UTF8.GetBytes(postData); //转化为数据流
var httpWebRequest = (HttpWebRequest) WebRequest.Create(uri); //创建HttpWebRequest对象
httpWebRequest.Method = "POST";
httpWebRequest.ContentLength = bytes.Length;
httpWebRequest.ContentType = "text/xml";
using (Stream requestStream = httpWebRequest.GetRequestStream())
{
requestStream.Write(bytes, , bytes.Count()); //输出流中写入数据
}
var httpWebResponse = (HttpWebResponse) httpWebRequest.GetResponse(); //创建响应对象
if (httpWebResponse.StatusCode != HttpStatusCode.OK) //判断响应状态码
{
string message = String.Format("POST failed. Received HTTP {0}", httpWebResponse.StatusCode);
throw new ApplicationException(message);
}
}
}
}
注释写的很清楚,
下面是服务端的代码:
using System;
using System.IO;
using System.Text;
using System.Web;
using Newtonsoft.Json; namespace HttpWebClientTest
{
/// <summary>
/// UploadImagHandle 的摘要说明
/// create by peng.li 2015-5-30
/// </summary>
public class UploadImagHandle : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/xml";
HandleMethod();
// context.Response.Write("Hello World");
} public bool IsReusable
{
get { return false; }
} private static void HandleMethod()
{
HttpContext httpContext = HttpContext.Current;
Stream httpRStream = httpContext.Request.InputStream;
var bytes = new byte[httpRStream.Length];
httpRStream.Read(bytes, , bytes.Length); //读取请求流对象
string req = Encoding.Default.GetString(bytes); //转换成字符串对象(这个字符串是json格式的)
var postParameters = JsonConvert.DeserializeObject<PostParameters>(req); //(反序列化)
int res = UploadImage(postParameters);
httpContext.Response.Write(res);
} public static int UploadImage(PostParameters postParameters)
{
string path = "E:/" + postParameters.Path;
try
{
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
File.WriteAllBytes(path, postParameters.FileByte);
return ;
}
catch (Exception)
{
return ;
}
}
}
}
这只是一个小的demo,希望能够起到抛砖引玉的作用,当然有表达错误的地方,也希望大家能指出来,一块学习,一块进步。
本人的.NET学习技术交流群:226704167
另附上demo下载链接:http://files.cnblogs.com/files/lip0121/HttpWebClientTestPostJson.rar
利用HttpWebRequest实现实体对象的上传的更多相关文章
- 利用jquery+iframe做一个ajax上传效果
以下是自学it网--中级班上课笔记 网址:www.zixue.it html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...
- base64格式图片转换为FormData对象进行上传
原理:理由ArrayBuffer.Blob和FormData var base64String = /*base64图片串*/; //这里对base64串进行操作,去掉url头,并转换为byte va ...
- win7下利用ftp实现华为路由器的上传和下载
win7下利用ftp实现华为路由器的上传和下载 1. Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...
- JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串、blob对象在上传
主题: JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串.blob对象在上传. 用处: 从本地选择图片上传,如项目规定只能选择本项目文件夹下的图像上传为头像等. 主要思想: ...
- 利用WCF与Android实现图片上传并传参
利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...
- 利用spring的MultipartFile实现文件上传【原】
利用spring的MultipartFile实现文件上传 主要依赖jar包 spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multi ...
- 利用Java API通过路径过滤上传多文件至HDFS
在本地文件上传至HDFS过程中,很多情况下一个目录包含很多个文件,而我们需要对这些文件进行筛选,选出符合我们要求的文件,上传至HDFS.这时就需要我们用到文件模式. 在项目开始前,我们先掌握文件模式 ...
- 利用Bootstrap简单实现一个文件上传进度条
© 版权声明:本文为博主原创文章,转载请注明出处 说明: 1. 使用commons-fileupload.jar实现文件上传及进度监听 2. 使用bootstrap的进度条进行页面显示 3. 因为进度 ...
- 利用exif.js解决ios手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
随机推荐
- 模仿东京首页banner轮播,京东新闻上下滚动动画实现(动画实现)
接着上篇 微信小程序-阅读小程序demo写:http://www.cnblogs.com/muyixiaoguang/p/5917986.html 首页banner动画实现 京东新闻上下动画实现 想着 ...
- helios架构详解(一)服务器端架构
看了“菜鸟耕地”的”.NET开源高性能Socket通信中间件Helios介绍及演示“,觉得这个东西不错.但是由于没有网络编程知识,所以高性能部分我就讲不出来了,主要是想根据开源代码跟大家分享下Heli ...
- ToolsCodeTemplate使用
最近学习使用CodeSmith代码生成器 CodeSmith 是一种语法类似于asp.net的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率. 作用:CodeSmith ...
- 使用BitArray判断素数
首先显示1024范围内的所有素数,然后显示输入的数是否是素数.1024 是代码中计算的素数的范围,可以修改.计算平方根,是为了确定一个基数的范围.1024的平方根是32,两个超过32 的数相乘,肯定大 ...
- Springboot框架
本片文章主要分享一下,Springboot框架为什么那么受欢迎以及如何搭建一个Springboot框架. 我们先了解一下Springboot是个什么东西,它是干什么用的.我是刚开始接触,查了很多资料, ...
- 微信小程序社区上线
微信小程序公测了! 从首次得到微信小程序发布的消息开始,小木和Michael就进入了紧急备战状态. 除了要快速学通微信小程序开发之外,我们还做了这些工作: 1.录制全球首套微信小程序实战项目类视频教程 ...
- android SQLite数据库总结
SQLite SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用. sql语法就 ...
- React Native class 后面的命名首字母需要大写
React Native class 后面的命名首字母需要大写 否则会报Expeted a component class,got [object Object].
- 搞不清FastCgi与PHP-fpm之间是个什么样的关系?
问 我在网上查fastcgi与php-fpm的关系,查了快一周了,基本看了个遍,真是众说纷纭,没一个权威性的定义. 网上有的说,fastcgi是一个协议,php-fpm实现了这个协议: 有的说,php ...
- KeySpaceNotification 键空间通知
KeySpaceNotification 键空间通知 1.Redis键淘汰机制简介 在Redis中,内存的大小是有限的,所以为了防止内存饱和,需要实现某种键淘汰策略.主要有两种方法,一种是当Redis ...