使用HttpWebRequest上载文件

本文关键字:文件 上载 HttpWebRequest 使用 | 更新日期: 2023-09-27 18:24:13

这是我的代码:

private void UploadFilesToRemoteUrl(string url, string[] files, string logpath, NameValueCollection nvc)
        {
            long length = 0;
            string boundary = "----------------------------" +
            DateTime.Now.Ticks.ToString("x");
            HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;
            httpWebRequest2.Method = "POST";
            httpWebRequest2.KeepAlive = true;
            httpWebRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials;
            Stream memStream = new System.IO.MemoryStream();
            byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("'r'n--" + boundary + "'r'n");

            string formdataTemplate = "'r'n--" + boundary + "'r'nContent-Disposition: form-data; name='"{0}'";'r'n'r'n{1}";
            foreach(string key in nvc.Keys)
            {
                string formitem = string.Format(formdataTemplate, key, nvc[key]);
                byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                memStream.Write(formitembytes, 0, formitembytes.Length);
            }

            memStream.Write(boundarybytes,0,boundarybytes.Length);
            string headerTemplate = "Content-Disposition: form-data; name='"{0}'";filename='"{1}'"'r'n Content-Type: application/octet-stream'r'n'r'n";
            for(int i=0;i<files.Length;i++)
            {
                string header = string.Format(headerTemplate,"file"+i,files[i]);
                byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
                memStream.Write(headerbytes,0,headerbytes.Length);
                FileStream fileStream = new FileStream(files[i], 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);
                }
                memStream.Write(boundarybytes,0,boundarybytes.Length);
                fileStream.Close();
            }
            httpWebRequest2.ContentLength = memStream.Length;
            Stream requestStream = httpWebRequest2.GetRequestStream();
            memStream.Position = 0;
            byte[] tempBuffer = new byte[memStream.Length];
            memStream.Read(tempBuffer,0,tempBuffer.Length);
            memStream.Close();
            requestStream.Write(tempBuffer,0,tempBuffer.Length );
            requestStream.Close();

            WebResponse webResponse2 = httpWebRequest2.GetResponse();
            Stream stream2 = webResponse2.GetResponseStream();
            StreamReader reader2 = new StreamReader(stream2);
            MessageBox.Show(reader2.ReadToEnd());
            webResponse2.Close();
            httpWebRequest2 = null;
            webResponse2 = null;
        }

我是这样称呼它的:

string[] filenames = new string[] { @"C:'Users'John'Desktop'ex.txt" };
NameValueCollection nvc = new NameValueCollection();
nvc.Add("cmd", "new");
nvc.Add("sTitle", "bugX");
nvc.Add("token", "someToken");
UploadFilesToRemoteUrl("https://myUrl.fogbugz.com/api.asp", filenames, "", nvc);

一切都很好,只是文件没有上传。

我也试过这个代码:

http://stackoverflow.com/questions/566462/upload-files-with-httpwebrequest-multipart-form-data

同样的事情也会发生。如何解决此问题?

以下是来自服务器的响应:

<?xml version='"1.0'" encoding='"UTF-8'"?>
<response>
    <case ixBug='"123486'" operations='"edit,assign,resolve,email,remind'"></case>
</response>

使用HttpWebRequest上载文件

您只是向服务器发送一个流,如果您不从服务器端为我们提供任何代码,就不可能知道服务器上发生了什么。我想您已经忘记在服务器端接收和创建文件了。

如果这不是问题所在,我建议您使用宝贵的工具fiddler,开始捕获httprequests并查看它们包含的内容。