利用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, 0, 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, 0, 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 1;
            }
            catch (Exception)
            {
                return 0;
            }
        }
    }
}

这只是一个小的demo,希望能够起到抛砖引玉的作用,当然有表达错误的地方,也希望大家能指出来,一块学习,一块进步。

本人的.NET学习技术交流群:226704167

另附上demo下载链接:http://files.cnblogs.com/files/lip0121/HttpWebClientTestPostJson.rar

时间: 2024-08-25 00:09:33

利用HttpWebRequest实现实体对象的上传的相关文章

JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串、blob对象在上传

主题: JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串.blob对象在上传. 用处: 从本地选择图片上传,如项目规定只能选择本项目文件夹下的图像上传为头像等. 主要思想: 使用canvas.toDataURL()方法将图片的绝对路径转换为base64编码. 具体用法: 在这我们引用淘宝服务器上的一张图片举例: var imgSrc = "https://img.alicdn.com/bao/uploaded/TB1qimQIpXXXXXbXFXXSutbFXXX.j

利用spring的MultipartFile实现文件上传【原】

利用spring的MultipartFile实现文件上传 主要依赖jar包 spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multipart.MultipartFile)commons-fileupload-1.3.1.jarcommons-logging-1.0.4.jar 前台 <!DOCTYPE html> <html lang="en"> <head> <meta ch

利用Socketserver实现简单的文件上传

利用Socketserver实现简单的文件上传 server.py #!/usr/bin/env python #coding:utf-8 import SocketServer import os class MyServer(SocketServer.BaseRequestHandler):     def handle(self):         base_path = 'C:/temp'         conn = self.request                 print

iOS利用AFNetworking(AFN) 实现图片上传

1.上传图片以二进制流的形式上传 1 #pragma mark - 文件上传  2 - (IBAction)uploadImage  3 {  4     /*  5      此段代码如果需要修改,可以调整的位置  6        7      1. 把upload.php改成网站开发人员告知的地址  8      2. 把file改成网站开发人员告知的字段名  9      */ 10     // 1. httpClient->url 11      12     // 2. 上传请求P

ios系统 竖屏拍照 canvas处理后 图片旋转(利用exif.js解决ios手机上传竖拍照片旋转90度问题)

转:https://www.cnblogs.com/lovelgx/articles/8656615.html ---恢复内容开始--- 问题:html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 解决方法:利用exif.js解决ios手机上传竖拍照片旋转90度问题 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 利用exif.js读取照片的拍摄信息,详见 htt

利用Java API通过路径过滤上传多文件至HDFS

在本地文件上传至HDFS过程中,很多情况下一个目录包含很多个文件,而我们需要对这些文件进行筛选,选出符合我们要求的文件,上传至HDFS.这时就需要我们用到文件模式. 在项目开始前,我们先掌握文件模式 1.文件模式 在某个单一操作中处理一系列文件是很常见的.例如一个日志处理的MapReduce作业可能要分析一个月的日志量.如果一个文件一个文件或者一个目录一个目录的声明那就太麻烦了,我们可以使用通配符(wild card)来匹配多个文件(这个操作也叫做globbing). Hadoop提供了两种方法

selenium2 python自动化测试之利用AutoIt工具实现本地文件上传

本人在学习基于python语言的selenium2自动测试方法的过程中,发现涉及本地上传文件的测试时,selenium2在定位本地window窗口的对象(元素)上能力有限.当上传按钮使用的是input标签时,可以使用send_keys()方法添加本地文件路径轻松实现,但有的上传控件使用的不是input元素,这个时候send_keys()方法是行不通的.经过网上搜索加上自己实践,总结出一个非常简单而有效的方法--借用AutoIt工具实现自动化本地上传文件,在此与大家分享. 1.AutoIt介绍及安

在Servlet中利用Apache开源类库实现文件上传

本文结合具体的范例,介绍如何通过Apache开源类库提供的软件包,在Servlet中进行文件上传.本文的参考书籍是<Tomcat与Java Web开发技术详解>第三版,作者:孙卫琴. 本文所用的软件版本为:Window10,JDK10,Tomcat9.本文所涉及的源代码的下载网址为:http://www.javathinker.net/javaweb/upload-app.rar Apache开源软件组织提供了与文件上传有关的两个软件包:? fileupload软件包(commons-file

JQUery利用Uploadify插件实现文件异步上传(十一)

一:简介: Uploadify是JQuery的一个上传插件,实现的效果非常好,带进度显示 ,且Ajax异步,能一次性上传多个文件,功能强大,使用简单 1.支持单文件或多文件上传,可控制并发上传的文件数 2.在服务器端支持各种语言与之配合使用,诸如PHP,.NET,Java…… 3.通过参数可配置上传文件类型及大小限制 4.通过参数可配置是否选择文件后自动上传 5.易于扩展,可控制每一步骤的回调函数(onSelect, onCancel……) 6.通过接口参数和CSS控制外观 二:官方下载 htt