C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法

本文实例讲述了C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法,在项目开发中有一定的实用价值,具体方法如下:

一、前言:

这篇文章翻译来自madmik3 写在 CodeProject 上的文章,原标题为: C#'s WebClient.UploadFile with more functionality.

二、正文:

我们使用 WebRequest 来获取网页内容是非常简单的,可是用他来上传文件就没有那么简单了。

如果我们在网页中上传文件,加入下面代码即可:

HTML 文件上传代码实例:

<form action ="http://localhost/test.php" method = POST>
 <input type = text name = uname>
 <input type = password name =passwd>
 <input type = FILE name = uploadfile>
 <input type=submit>
</form>

但,如果在C#中使用 WebRequest 上传,必须对本地文件进行相应的处理才能提交到指定的HTTP地址,下面这个函数哦就帮我们做了这烦恼的操作

UploadFileEx 上传文件函数:

public static string UploadFileEx( string uploadfile, string url,
  string fileFormName, string contenttype,NameValueCollection querystring,
  CookieContainer cookies)
{
  if( (fileFormName== null) ||
    (fileFormName.Length ==0))
  {
    fileFormName = "file";
  }  

  if( (contenttype== null) ||
    (contenttype.Length ==0))
  {
    contenttype = "application/octet-stream";
  }
   string postdata;
  postdata = "?";
  if (querystring!=null)
  {
    foreach(string key in querystring.Keys)
    {
      postdata+= key +"=" + querystring.Get(key)+"&";
    }
  }
  Uri uri = new Uri(url+postdata);  

  string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
  HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
  webrequest.CookieContainer = cookies;
  webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
  webrequest.Method = "POST";  

  // Build up the post message header
  StringBuilder sb = new StringBuilder();
  sb.Append("--");
  sb.Append(boundary);
  sb.Append("");
  sb.Append("Content-Disposition: form-data; name=\"");
  sb.Append(fileFormName);
  sb.Append("\"; filename=\"");
  sb.Append(Path.GetFileName(uploadfile));
  sb.Append("\"");
  sb.Append("");
  sb.Append("Content-Type: ");
  sb.Append(contenttype);
  sb.Append("");
  sb.Append("");        

  string postHeader = sb.ToString();
  byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);  

  // Build the trailing boundary string as a byte array
  // ensuring the boundary appears on a line by itself
  byte[] boundaryBytes =
      Encoding.ASCII.GetBytes("--" + boundary + "");  

  FileStream fileStream = new FileStream(uploadfile,
                FileMode.Open, FileAccess.Read);
  long length = postHeaderBytes.Length + fileStream.Length +
                      boundaryBytes.Length;
  webrequest.ContentLength = length;  

  Stream requestStream = webrequest.GetRequestStream();  

  // Write out our post header
  requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);  

  // Write out the file contents
  byte[] buffer = new Byte[checked((uint)Math.Min(4096,
               (int)fileStream.Length))];
  int bytesRead = 0;
  while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )
    requestStream.Write(buffer, 0, bytesRead);  

  // Write out the trailing boundary
  requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
  WebResponse responce = webrequest.GetResponse();
  Stream s = responce.GetResponseStream();
  StreamReader sr = new StreamReader(s);  

  return sr.ReadToEnd();
}

调用代码如下:

CookieContainer cookies = new CookieContainer();
//add or use cookies
NameValueCollection querystring = new NameValueCollection();
querystring["uname"]="uname";
querystring["passwd"]="snake3";
string uploadfile;// set to file to upload
uploadfile = "c:\\test.jpg";  

//everything except upload file and url can be left blank if needed
string outdata = UploadFileEx(uploadfile,
   "http://localhost/test.php","uploadfile", "image/pjpeg",
   querystring,cookies);

至此,所有主要功能代码都已经介绍完毕,至于美化你的程序就要读者根据自己的喜好完成了。

作者还提供了接收文件的PHP代码,,个人觉得既然能写上传的程序,接收文件的Server Page应该不在话下的,况且又不是PHP才能接收提交的文件,ASP,ASP.NET,JSP都可以,这里就不再啰嗦了。

(0)

相关推荐

  • jQuery结合C#实现上传文件的方法

    本文实例讲述了jQuery结合C#实现上传文件的方法.分享给大家供大家参考.具体实现方法如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <script src="jquery-1.7.1.min.js"></script> <script src="j

  • C# 通用文件上传类

    1.Upfile.aspx: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Upfile.aspx.cs" Inherits="Inc_Upfile" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http

  • C#判断上传文件是否是图片以防止木马上传的方法

    很多时候木马程序会伪装成其他格式的文件上传到网站,最常见的如图片格式.本文就以C#为例讲述C#判断上传文件是否是图片以防止木马上传的方法,具体方法如下: 方法一:用image对象判断是否为图片 /// <summary> /// 判断文件是否为图片 /// </summary> /// <param name="path">文件的完整路径</param> /// <returns>返回结果</returns> pu

  • ASP.NET(C#)实现一次性动态上传多张图片的代码(多个文件)

    在做asp.net的Web开发的时候,我们经常会遇到一次性上传多个文件的需求.通常我们的解决方法是固定放多个上传文件框,这样的解决办法显然是不合理的,因为一次上传多个,就意味着数量不确定.因此我们就要让这些文件上传框动态添加,下面我以我做的一个图库管理中的上传图片的功能为例 先看效果: 打开的初始界面: 默认是上传一个图片,但当我们点"增加图片"按钮时可以实现选择多个图片及其描述同时上传,本功能限制一次最多只能上传8张,且每张图片大小不超过1M,这个大家可根据实际情况更改! 如图: 下

  • C#实现Web文件上传的两种方法实例代码

    1. C#实现Web文件的上传 使用C#如何实现文件上传的功能呢?下面笔者简要介绍一下. 首先,在你的Visual C# web project 中增加一个上传用的Web Form,为了要上传文件,需要在ToolBox中选择HTML类的File Field控件,将此控件加入到Web Form中,然而此时该控件还不是服务端控件,我们需要为它加上如下一段代码:<input id=PreviousFile1 type=file size=49 runat="server">,这样

  • asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)

    在Web开发中,有很多可以上传的组件模块,利用HTML的File控件的上传也是一种办法,不过这种方式,需要处理的细节比较多,而且只能支持单文件的操作.在目前Web开发中用的比较多的,可能uploadify(参考http://www.uploadify.com/)也算一个吧,不过这个版本一直在变化,他们的脚本调用也有很大的不同,甚至调用及参数都一直在变化,很早的时候,那个Flash的按钮文字还没法变化,本篇随笔主要根据项目实际,介绍一下3.1版本的uploadify的控件使用,这版本目前还是最新的

  • C# 文件上传 默认最大为4M的解决方法

    1,环境:window 2003 ,IIS6.0 要首先要修改IIS6.0中的asp请求的最大字节数,默认时为200K: 方法:打开位于 C:\Windows\System32\Inetsrv 中的 metabase.XML, 并修改 AspMaxRequestEntityAllowed 为你需要的值(例如 "1073741824", 1GB): 技术背景: 在 IIS 6.0 中, AspMaxRequestEntityAllowed 属性指定了一个 ASP 请求(Request)可

  • C#实现文件上传以及多文件上传功能

    一.前端搭建 1.前端用到js:uploadify(下载地址:http://www.uploadify.com/download/).layer (下载地址:http://layer.layui.com/),下载之后把它们放在你的项目里 列如 2.根据你的需要在你项目适当的位置建立上传文件的目录  列如(File) 到此前端搭建结束 二.配置文件修改(可选择跳过此步骤) 1.首先说明下,这个步骤可以跳过,此步骤主要是修改上传文件大小的限制(.net 默认最大只能上传4M)如若需要修改请继续阅读该

  • C#实现HTTP上传文件的方法

    本文实例讲述了C#实现HTTP上传文件的方法.分享给大家供大家参考.具体实现方法如下: 发送文件代码如下: 复制代码 代码如下: /// <summary> /// Http上传文件 /// </summary> public static string HttpUploadFile(string url, string path) {     // 设置参数     HttpWebRequest request = WebRequest.Create(url) as HttpWe

  • asp.net(C#)中上传大文件的几中常见应用方法

    几种常见的方法,本文主要内容包括: 第一部分:首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改Web.Config文件来自定义最大文件大小,如下: 这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大 MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理.解决的方法是利用隐含的 HttpWorkerRequest,用它的GetPreloaded

随机推荐