C# Socket Post File

     ///<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

posted @ 2017-05-05 15:46  keepsilence  阅读(355)  评论(0编辑  收藏  举报