C#中post用法如下:
首先,POST请求会把请求的数据放置在HTTP请求包的包体中。
其次,POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
最后,POST的安全性较高。
通过C#post文件流的如下代码为:
using System
using System.Collections.Generic
using System.Collections.Specialized
using System.IOusing System.Net
using System.Text
public class HttpPost{
/// <summary>悔稿 ///
以Post 形式提交数据到 uri
/// </summary> ///
<param name="uri">
</param>
/// <param name="files">
</param>
/// <param name="values"></param>
/// <returns></returns>
public static byte[] Post(Uri uri, IEnumerable<UploadFile>files, NameValueCollection values) {
string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x"氏前旅)
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri)
request.ContentType = "multipart/form-databoundary=" + boundary
request.Method = "POST"
request.KeepAlive = true
request.Credentials = CredentialCache.DefaultCredentials
MemoryStream stream = new MemoryStream()
byte[] line = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n")
//提交文本字段
if (values != null)
{
string format = "\r\n--" + boundary + "\r\nContent-Disposition: form-dataname=\"{0}\"歼凳\r\n\r\n{1}"
foreach (string key in values.Keys)
{
string s = string.Format(format, key, values[key])
byte[] data = Encoding.UTF8.GetBytes(s)
stream.Write(data, 0, data.Length)
}
stream.Write(line, 0, line.Length) }
//提交文件
if (files != null)
{
string fformat = "Content-Disposition: form-dataname=\"{0}\"filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n"
foreach (UploadFile file in files)
{ string s = string.Format(fformat, file.Name, file.Filename)
byte[] data = Encoding.UTF8.GetBytes(s)
stream.Write(data, 0, data.Length)
stream.Write(file.Data, 0, file.Data.Length)
stream.Write(line, 0, line.Length)
} }
request.ContentLength = stream.Length
Stream requestStream = request.GetRequestStream()
stream.Position = 0L
stream.CopyTo(requestStream)
stream.Close()
requestStream.Close()
using (var response = request.GetResponse())
using (var responseStream = response.GetResponseStream())
using (var mstream = new MemoryStream())
{ responseStream.CopyTo(mstream)
return mstream.ToArray() } }
/// <summary> /// 上传文件
/// </summary>
public class UploadFile
{
public UploadFile()
{
ContentType = "application/octet-stream" }
public string Name { getset}
public string Filename { getset}
public string ContentType { getset}
public byte[] Data { getset} }}
获取http请求报文头部信息
利用nodejs中的 http.ServerRequest中获取1):
request.method
用来标识世野纤请求类型
request.headers
其中我们关心两个字段:
content-type
包含了表单类型和边界字符串(下面会介绍)信息。
content-length
post数据的长度
关于content-type
get请求的headers中没有content-type这个字段
post 的 content-type 有两种
application/x-www-form-urlencoded
这种就是一般的文本表单用post传地数据,只要将得到的脊亩data用querystring解析下就可以了
multipart/form-data
文件表单的传输,也是本文介绍的重点
获取POST数据
前面已经说过,post数据的传输是可能分包的,因此必然是异步的。post数据的接受过程如下:
var postData = ''request.addListener("data", function(postDataChunk) { // 有新的数据包到达就执行
postData += postDataChunk
console.log("Received POST data chunk '"+
postDataChunk + "'.")
})
request.addListener("end", function() { // 数据传输完毕
console.log('post data finish receiving: ' + postData )
})
注意,对于非文件post数据,上面以字符串接收是没问题的,但其实 postDataChunk 是一个 buffer 类型数据,在搜仿遇到二进制时,这样的接受方式存在问题。
您好,提问者:
首先表单、文件同时发送那么肯定是可以的,关于获取的话很难了,因为发送文件的型改话form必须设置为:multipart/form-data数据格式,默认为:application/x-www-form-urlencoded表单格式。我们称之为二进制流和普通数据流。
刚才说了<form的entype要改为multipart/form-data才能进行发送文件,那么这个时候你表单的另外数据就也会被当成二进制一起发送到服务端。
获取读取过来的内容如下:
//拿到用户传送过来的字节流InputStream is = request.getInputStream()
byte[] b = new byte[1024]
int len = 0
while((len = is.read(b)) != -1){
System.out.println(new String(b,0,len))
}
上面如图的代码,我们发现发送过来的表单数据跟文件数据是混乱竖租搭的,我们根本没办法解析(很麻烦),余拿这个时候我们就需要用到第三方辅助(apache 提供的fileupload.jar)来进行获取。
这个网上有很多代码的,如果有什么不明白可以去自行百度,或者追问,我这里只是给你提供的思路,希望理解,谢谢!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)