前台代码如下:<form method="post" action="http://xxxxx.xxxxx.com/api/xxxxx.php" enctype="multipart/form-data">
EMAIL<input type="text" name="EMAIL"  />
PASSWORD<input type="text" name="PASSWORD"/>
TEXT<input type="text" name="TEXT"/>
</br>
PLACE_ID<input type="text" name="PLACE_ID"/>
PHOTO<input type="file" name="PHOTO" />
DEBUG<input type="text" name="DEBUG"/>
<input type="submit"  value="Add" />
</form>C#现已构造了一个API类用来向服务器提交数据,使用的是HttpWebRequest异步通信,代码如下:public class API
    {
        protected string baseUrl = @"http://xxxxx.xxxxx.com/api/";
        protected string paramData = string.Empty;
        public string resData = string.Empty;
        public static string restitle;
        public static string content;
        public static string username;
        public static string friend_name;
        protected string url = string.Empty;
        protected HttpStatusCode statusCode;
        protected Exception errorAsync;
        protected Encoding dataEncode = Encoding.UTF8;        public void RequestURL()
        {
            HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(url));
            webReq.Method = "POST";
            webReq.ContentType = "application/x-www-form-urlencoded";
            webReq.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), webReq);
        }
        private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
                Stream postStream = request.EndGetRequestStream(asynchronousResult);
                byte[] byteArray = dataEncode.GetBytes(paramData);
                postStream.Write(byteArray, 0, byteArray.Length);
                postStream.Close();
                request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
            }
            catch (Exception ee)
            {
                errorAsync = ee;
            }
        }        private void GetResponseCallback(IAsyncResult asynchronousResult)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
                Stream streamResponse = response.GetResponseStream();
                StreamReader streamRead = new StreamReader(streamResponse);
                resData = streamRead.ReadToEnd();
                statusCode = response.StatusCode;
                streamResponse.Close();
                streamRead.Close();
                JObject j = (JObject)JsonConvert.DeserializeObject(resData,typeof(JObject));
                restitle = j.GetValue("title").ToString();
                ProcessResponseData();
            }
            catch (Exception ee)
            {
                errorAsync = ee;
            }
        }
        public virtual void ProcessResponseData()
        {
           //由子类对此函数不同的去实现           
        }
    }若不提交图片,则在C#中构造参数的代码如下:this.paramData = @"EMAIL=" + username + @"&PASSWORD=" + password + @"&TEXT="+text+@"&PLACE_ID="+place_id+@"&DEBUG=yes";现在要想把文字和图片同时post到服务器上,该如何实现呢?

解决方案 »

  1.   

     webReq.ContentType = "application/x-www-form-urlencoded";
    ---》multipart/form-data
      

  2.   

    //边界            string boundary = DateTime.Now.Ticks.ToString("x");            HttpWebRequest uploadRequest = (HttpWebRequest)WebRequest.Create(url);//url为上传的地址            uploadRequest.ContentType = "multipart/form-data; boundary=" + boundary;            uploadRequest.Method = "POST";            uploadRequest.Accept = "*/*";            uploadRequest.KeepAlive = true;            uploadRequest.Headers.Add("Accept-Language", "zh-cn");            uploadRequest.Headers.Add("Accept-Encoding", "gzip, deflate");            uploadRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;            uploadRequest.Headers["Cookie"] = cookies;//上传文件时需要的cookies            WebResponse reponse;            //创建一个内存流            Stream memStream = new MemoryStream();            //确定上传的文件路径            if (!String.IsNullOrEmpty(file))            {                boundary = "--" + boundary;                //添加上传文件参数格式边界                string paramFormat = boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}\r\n";                NameValueCollection param = new NameValueCollection();                param.Add("fname", Guid.NewGuid().ToString() + Path.GetExtension(file));                               //写上参数                foreach (string key in param.Keys)                {                    string formitem = string.Format(paramFormat, key, param[key]);                    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);                    memStream.Write(formitembytes, 0, formitembytes.Length);                }                //添加上传文件数据格式边界                string dataFormat = boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:application/octet-stream\r\n\r\n";                string header = string.Format(dataFormat, "Filedata", Path.GetFileName(file));                byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);                memStream.Write(headerbytes, 0, headerbytes.Length);                //获取文件内容                FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);                byte[] buffer = new byte[1024];                int bytesRead = 0;                //将文件内容写进内存流                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)                {                    memStream.Write(buffer, 0, bytesRead);                }                fileStream.Close();                //添加文件结束边界                byte[] boundarybytes = System.Text.Encoding.UTF8.GetBytes("\r\n\n" + boundary + "\r\nContent-Disposition: form-data; name=\"Upload\"\r\n\nSubmit Query\r\n" + boundary + "--");                memStream.Write(boundarybytes, 0, boundarybytes.Length);                //设置请求长度                uploadRequest.ContentLength = memStream.Length;                //获取请求写入流                Stream requestStream = uploadRequest.GetRequestStream();                               //将内存流数据读取位置归零                memStream.Position = 0;                byte[] tempBuffer = new byte[memStream.Length];                memStream.Read(tempBuffer, 0, tempBuffer.Length);                memStream.Close();                //将内存流中的buffer写入到请求写入流                requestStream.Write(tempBuffer, 0, tempBuffer.Length);                requestStream.Close();            }            //获取到上传请求的响应            reponse = uploadRequest.GetResponse();