从客户端到webrequest的流文件

时间:2011-05-27 19:24:49

标签: c# stream webrequest

我正在从c#web应用程序上传文件,从客户端计算机转移到远程云主机。用户键入文件名和位置,并将其传递给服务器。我正在将文件的内容以块的形式传输到请求中。但是,该文件到达目标时无效。我确信它与我的请求标题和垃圾有点相关,因为我可以在从服务器上传到远程位置时完成这项工作。谁能发现什么是错的?

while (bytesRemaining > 0)
{
    if (!sw.CanRead)
    {
        sw = File.OpenRead(txtFileUpload.Text);
        if (offset > 0)
            sw.Seek(offset, SeekOrigin.Begin);
    }

    int count = sw.Read(buffer, 0, (int) chunk);

    request =
        (HttpWebRequest)
        WebRequest.Create("http://xxxxxx.com/write/" +
                          offset);
    request.Method = "POST";
    request.ReadWriteTimeout = int.MaxValue;
    request.Timeout = int.MaxValue;
    request.KeepAlive = false;
    string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
    request.ContentType = "multipart/form-data; boundary=" + boundary;

    var postData = new MemoryStream();
    const string newLine = "\r\n";
    var sw3 = new StreamWriter(postData);
    sw3.Write("--" + boundary + newLine);
    sw3.Write("Content-Disposition: form-data;name=\"{0}\";filename=\"{1}\"{2}", "upload",
              txtFileName.Text, newLine);
    sw3.Write("Content-Type: multipart/form-data " + newLine + newLine);
    sw3.Flush();

    postData.Write(buffer, 0, count);
    sw3.Write(newLine);
    sw3.Write("--{0}--{1}", boundary, newLine);
    sw3.Flush();

    request.ContentLength = postData.Length;
    using (Stream s = request.GetRequestStream())
        postData.WriteTo(s);

    sw3.Write("--" + boundary + newLine);
    sw3.Write("Content-Disposition: form-data;name=\"\"" + newLine);
    sw3.Write("content-type:octet-stream;charset=windows-1250" + newLine);

    sw3.Write("VALUE" + newLine);
    sw3.Write("--{0}--{1}", boundary, newLine);
    sw3.Flush();
    postData.Close();

    // These next 3 lines are what I had before, instead of all the previous
    // code, which worked when uploading a file from the server to the remote
    // location.
    //using (Stream sw2 = request.GetRequestStream())
    //{
    //    sw2.Write(buffer, 0, count);
    //}

    using (WebResponse resp = request.GetResponse())
    {
        resp.Close();
    }

    offset += count;
    bytesRemaining -= count;

}

1 个答案:

答案 0 :(得分:1)

为什么重新发明轮子?使用

WebClient.UploadFile

http://msdn.microsoft.com/en-us/library/system.net.webclient.uploadfile(v=vs.71).aspx

他们甚至有一个例子。