加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

WPF(C#)如何使用post请求传输文件?

发布时间:2020-12-15 21:42:24 所属栏目:百科 来源:网络整理
导读:我有一个以字节数组的形式呈现的图片.我需要将其保存到文件并发送帖子请求.告诉我如何做得更好 这就是我的工作 private Stream file; public void Fun1() { using (file = IsolatedStorageHelper.OpenFile(Picture,FileMode.Create)) { file.Write(bt,bt.Len
我有一个以字节数组的形式呈现的图片.我需要将其保存到文件并发送帖子请求.告诉我如何做得更好

这就是我的工作

private Stream file;


 public void Fun1()

  {

   using (file = IsolatedStorageHelper.OpenFile(Picture,FileMode.Create))

      {

       file.Write(bt,bt.Length);
       _cookies = DataHolder.Instance.Cookies;
       HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Concat("http://   Mysite.com/image.php?image=FILE",file));
            request.Method = "POST";
            request.ContentType = "multipart/form-data";
            request.CookieContainer = _cookies;     
            request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallbackPlayersfun1),request);

      }

   }

 private void GetRequestStreamCallbackPlayersfun1(IAsyncResult asynchronousResult)

{

        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        Stream postStream = request.EndGetRequestStream(asynchronousResult);
 using (file = IsolatedStorageHelper.OpenFile(Picture,FileMode.Open))
        {

            BinaryReader br = new BinaryReader(file,Encoding.UTF8);
            byte[] buffer = br.ReadBytes(2048);
            while (buffer.Length > 0)
            {
                postStream.Write(buffer,buffer.Length);
                buffer = br.ReadBytes(2048);
            }
        }
        postStream.Close();

        request.BeginGetResponse(new AsyncCallback(ReadCallbackSavePlayersfun1),request);

}

 private void ReadCallbackSavePlayersfun1(IAsyncResult asynchronousResult)

{

  lock (__SYNC)

{

    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);

            }
        }

结果,服务器没有来,告诉我我做错了什么

感谢您的回复.

但我有另一个问题.我的图片以字符串编码,我写入流中的字符串并尝试发送到服务器.作为回应,一切都很好,但请求的类型是“获取”(变量响应,方法ReadCallbackSavePlayersfun1).请告诉我出了什么问题

public void Fun1()

{

string str = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAA";

using (file = IsolatedStorageHelper.OpenFile(Picture,FileMode.Create))

{
                StreamWriter w = new StreamWriter(file,Encoding.UTF8);
                w.WriteLine(str);
                 _cookies = DataHolder.Instance.Cookies;

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Concat("http://Mysite.com/image.php"));
                string boundary = "----------" + DateTime.UtcNow.Ticks.ToString("x",CultureInfo.InvariantCulture);
                request.Method = "POST";
                request.ContentType = "multipart/form-data; boundary=" + boundary;
                request.CookieContainer = _cookies;


                request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallbackPlayersfun1),request);
                w.Close();

             }

}


 private void GetRequestStreamCallbackPlayersfun1(IAsyncResult asynchronousResult)

 {

        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        Stream postStream = request.EndGetRequestStream(asynchronousResult);
 string boundary = "----------" + DateTime.UtcNow.Ticks.ToString("x",CultureInfo.InvariantCulture);
        var sbHeader = new StringBuilder();
        if (file != null)

 {
            sbHeader.AppendFormat("--{0}rn",boundary);
            sbHeader.AppendFormat("Content-Disposition: form-data; name="{0}"; filename="{1}"rn","picture",file);
            sbHeader.AppendFormat("Content-Type: {0}rnrn",request.ContentType);

}
        using (file = IsolatedStorageHelper.OpenFile(Picture,FileMode.Open))

{
            byte[] header = Encoding.UTF8.GetBytes(sbHeader.ToString());
            byte[] footer = Encoding.UTF8.GetBytes("rn--" + boundary + "--rn");
            long contentLength = header.Length + (file != null ? file.Length : 0) + footer.Length;

            postStream.Write(header,header.Length);
 if (file != null)

{


                BinaryReader br = new BinaryReader(file,Encoding.UTF8);
                byte[] buffer = br.ReadBytes(2048);
                while (buffer.Length > 0)

{
                    postStream.Write(buffer,buffer.Length);
                    buffer = br.ReadBytes(2048);

 }
                br.Close();


}

            postStream.Write(footer,footer.Length);
            postStream.Flush();
            postStream.Close();
}

 request.BeginGetResponse(new AsyncCallback(ReadCallbackSavePlayersfun1),request);


}

  private void ReadCallbackSavePlayersfun1(IAsyncResult asynchronousResult)

{
            lock (__SYNC)

{
                HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);

                try

{
                    String doc = "";
                    using (Stream streamResponse = response.GetResponseStream())

 {
                        Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
                        StreamReader readStream = new StreamReader(streamResponse,encode);
                        Char[] read = new Char[256];  
                        int count = readStream.Read(read,256);
                        while (count > 0)

{
                            String str = new String(read,count);
                            doc += str;
                            count = readStream.Read(read,256);

}

}


}
                catch 
{ }

}

}

解决方法

在.Net中发布web byte []数据并不那么简单.将byte []保存到存储很容易,因此我没有代码,但这是我用来发布二进制数据的方法.

这最初来自http://skysanders.net/subtext/archive/2010/04/12/c-file-upload-with-form-fields-cookies-and-headers.aspx,我的修改适合

要获取FileInfo,只需传入即可

new FileInfo(fullPath)

祝好运 : )

/// <summary>
    /// Create a new HttpWebRequest with the default properties for HTTP POSTS
    /// </summary>
    /// <param name="url">The URL to be posted to</param>
    /// <param name="referer">The refer</param>
    /// <param name="cookies">CookieContainer that should be used in this request</param>
    /// <param name="postData">The post data</param>
    private string CreateHttpWebUploadRequest(string url,string referer,CookieContainer cookies,NameValueCollection postData,FileInfo fileData,string fileContentType)
    {
        var request = (HttpWebRequest)HttpWebRequest.Create(url);
        string boundary = "----------" + DateTime.UtcNow.Ticks.ToString("x",CultureInfo.InvariantCulture);

        // set the request variables
        request.Method = WebRequestMethods.Http.Post;
        request.ContentType = "multipart/form-data; boundary=" + boundary;
        request.CookieContainer = cookies;
        request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML,like Gecko) Chrome/5.0.375.55 Safari/533.4";
        request.Accept = "image/gif,image/jpeg,image/pjpeg,*/*";
        request.Headers.Add("Accept-Encoding: gzip,deflate");
        request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        request.Headers.Add("Accept-Language: en-us");
        request.Referer = referer;
        request.KeepAlive = true;
        request.AllowAutoRedirect = false;

        // process through the fields
        var sbHeader = new StringBuilder();

        // add form fields,if any
        if (postData != null)
        {
            foreach (string key in postData.AllKeys)
            {
                string[] values = postData.GetValues(key);
                if (values != null) 
                {
                    foreach (string value in values)
                    {
                        if (!string.IsNullOrEmpty(value))
                            sbHeader.AppendFormat("--{0}rn",boundary);
                            sbHeader.AppendFormat("Content-Disposition: form-data; name="{0}";rnrn{1}rn",key,value);
                    }
                }
            }
        }

        if (fileData != null)
        {
            sbHeader.AppendFormat("--{0}rn","media",fileData.Name);
            sbHeader.AppendFormat("Content-Type: {0}rnrn",fileContentType);
        }

        byte[] header = Encoding.UTF8.GetBytes(sbHeader.ToString());
        byte[] footer = Encoding.UTF8.GetBytes("rn--" + boundary + "--rn");
        long contentLength = header.Length + (fileData != null ? fileData.Length : 0) + footer.Length;

        // set content length
        request.ContentLength = contentLength;

        // ref https://stackoverflow.com/questions/2859790/the-request-was-aborted-could-not-create-ssl-tls-secure-channel
        // avoid The request was aborted: Could not create SSL/TLS secure channel exception
        ServicePointManager.Expect100Continue = false;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

        using (var requestStream = request.GetRequestStream())
        {
            requestStream.Write(header,header.Length);

            // write the uploaded file
            if (fileData != null)
            {
                // write the file data,if any
                byte[] buffer = new Byte[fileData.Length];
                var bytesRead = fileData.OpenRead().Read(buffer,(int)(fileData.Length));
                requestStream.Write(buffer,bytesRead);
            }

            // write footer
            requestStream.Write(footer,footer.Length);
            requestStream.Flush();
            requestStream.Close();

            using (var response = request.GetResponse() as HttpWebResponse)
            using (var stIn = new System.IO.StreamReader(response.GetResponseStream()))
            {
                return stIn.ReadToEnd();
            }
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读