///<summary>
///向服务器发送混合型的请求,1:成功发送,0:发送失败
///</summary>
///<param name="paranames">表单参数名数组</param>
///<param name="paravalues">参数值数组</param>
///<param name="files">文件名数组</param>
///<param name="errmsg">报错信息</param>
///<returns></returns>
public int SendRequest(string[] paranames, string[] paravalues, string[] files, ref string errmsg)
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.201"), 8085));
StringBuilder http, text;
byte[] httpbyte;
byte[] textbyte = null;
long length = 0;
DateTime now = DateTime.Now;
List<byte[]> data = new List<byte[]>();
//构造时间戳
string strBoundary = "------------" + DateTime.Now.Ticks.ToString("x");
byte [] end = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "--\r\n");//结束标记
byte[] boundary = Encoding.ASCII.GetBytes("\r\n" + strBoundary + "\r\n");
//加载表单参数信息
if (paranames != null)
{
text = new StringBuilder();
for (int i = 0; i < paranames.Length; i++)
{
text.Append("--");
text.Append(strBoundary);//添加时间戳
text.Append("\r\n");
text.Append("Content-Disposition: form-data; name=\"" + paranames[i] + "\"\r\n\r\n");
text.Append(paravalues[i]);
text.Append("\r\n");
}
string para = text.ToString();
textbyte = Encoding.ASCII.GetBytes(para);
length += textbyte.Length;
}
//加载文件信息
if (files != null)
{
for (int i = 0; i < files.Length; i++)
{
FileStream fs;
StringBuilder sbfile = new StringBuilder();
try
{
fs = File.Open(files[i], FileMode.Open, FileAccess.Read, FileShare.Read);
if (i == 0) sbfile.Append("--");//添加文件
else sbfile.Append("\r\n--");
sbfile.Append(strBoundary);//添加时间戳
sbfile.Append("\r\n");
sbfile.Append("Content-Disposition: form-data; name=\"");
sbfile.Append("file");
sbfile.Append("\"; filename=\"");
sbfile.Append("2222.png");
sbfile.Append("\"");
sbfile.Append("\r\n");
sbfile.Append("Content-Type: ");
sbfile.Append("application/octet-stream");
sbfile.Append("\r\nContent-Length:");
sbfile.Append(fs.Length.ToString());
sbfile.Append("\r\n");
sbfile.Append("\r\n");
string temp = sbfile.ToString();
byte[] bin = Encoding.UTF8.GetBytes(temp);
data.Add(bin);
length += bin.Length;
length += fs.Length;
fs.Close();
}
catch (Exception exc)
{
errmsg = exc.Message.ToString();
return 0;
}
}
}
//构造http头
http = new StringBuilder();
http.Append("POST http://192.168.0.201:8085/api/file/upload HTTP/1.1\r\n");
http.Append("Content-Type:multipart/form-data;boundary=");
http.Append(strBoundary);
http.Append("\r\n");
http.Append("Host: 192.168.0.201:8085\r\n");
http.Append("Content-Length:");
http.Append((length+end.Length).ToString());
http.Append("\r\n");
http.Append("Expect: 100-continue\r\n");//注明要在收到服务器的continue消息后才继续上传http消息体
http.Append("Connection: Keep-Alive\r\n\r\n");
string strtemp = http.ToString();
httpbyte = Encoding.ASCII.GetBytes(strtemp);
try
{
s.Send(httpbyte);// "//首先发送http头
Thread.Sleep(100);
//string check = GetResponse();
//if (check == null || !check.Contains("Continue"))//得到服务器确认后才继续上传
//{
// errmsg = "客户端已成功发送请求,但服务器没有响应!";
// return 0;
//}
if (paranames != null)
{
s.Send(textbyte, textbyte.Length, SocketFlags.None);//发送表单参数
}
if (files != null)
{//依次发送文件
for (int i = 0; i < data.Count; i++)
{
int size = 0;
FileStream fs = File.Open(files[i], FileMode.Open, FileAccess.Read, FileShare.Read);
s.Send(data[i], data[i].Length, SocketFlags.None);
byte[] buff = new byte[1024];
size = fs.Read(buff, 0, 1024);
while (size > 0)
{
s.Send(buff, size, SocketFlags.None);
size = fs.Read(buff, 0, 1024);
}
fs.Close();
}
}
s.Send(end, end.Length, SocketFlags.None);
return 1;
}
catch (Exception exc)
{
errmsg = exc.Message.ToString();
return 0;
}
}
C# Socket Post 提交文件到服务器上 其中最重要的就是
上传文件的时候一定要主要提交结束标记
就是上文中的end