将二进制数据从C#上传到PHP

时间:2014-05-08 09:07:02

标签: c# php

我想将文件从Windows C#应用程序上传到运行PHP的Web服务器。

我知道WebClient.UploadFile方法,但我希望能够以块的形式上传文件,以便我可以监视进度并能够暂停/恢复。

因此,我正在阅读文件的一部分并使用WebClient.UploadData方法。

我遇到的问题是我不知道如何访问来自php的UploadData发送的数据。如果我对post数据执行print_r,我可以看到有二进制数据,但我不知道访问它的密钥。如何访问二进制数据?有没有更好的方法我应该完全这样做?

String file = "C:\\Users\\Public\\uploadtest\\4.wmv";

using (BinaryReader b = new BinaryReader(File.Open(file, FileMode.Open)))
{
    int pos = 0;
    int required = 102400;
    b.BaseStream.Seek(pos, SeekOrigin.Begin);
    byte[] by = b.ReadBytes(required);

    using (WebClient wc = new WebClient()){
        wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
        byte[] result = wc.UploadData("http://192.168.0.52/html/application.php", "POST", by);
        String s = System.Text.Encoding.UTF8.GetString(result, 0, result.Length);
        MessageBox.Show(s);
    }
}

enter image description here

2 个答案:

答案 0 :(得分:1)

这就是我进行HTTP通信的方式。

我想当我到达using()时,正在设置HTTP连接,并且在using() {...}正文中你可以暂停和填充。

string valueString = "...";
string uriString = "http://someUrl/somePath";
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uriString);
httpWebRequest.Method = "POST";
string postData = "key=" + Uri.EscapeDataString(valueString);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.ContentLength = byteArray.Length;
using (Stream dataStream = httpWebRequest.GetRequestStream())
{
    // do pausing and stuff here by using a while loop and changing byteArray.Length into the desired length of your chunks
    dataStream.Write(byteArray, 0, byteArray.Length);
}
HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
Stream receiveStream = httpWebResponse.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream);
string internalResponseString = readStream.ReadToEnd();

但是在上传文件时,您应该使用multipart/form-data代替application/x-www-form-urlencoded。另见:http://www.php.net/manual/en/features.file-upload.post-method.php

在php中,您可以使用超全局变量$ _FILES(例如print_r($_FILES);)来访问上传的文件。

另请阅读:https://stackoverflow.com/a/20000831/1209443了解有关如何处理multipart/form-data

的更多信息

答案 1 :(得分:0)

使用它。这肯定会起作用。         System.Net.WebClient Client = new System.Net.WebClient();

    Client.Headers.Add("Content-Type", "binary/octet-stream");
    byte[] result = Client.UploadFile("http://192.168.0.52/mipzy/html/application.php", "POST", file);
    string s = System.Text.Encoding.UTF8.GetString(result, 0, result.Length); 
   MessageBox.Show(s);

或使用

的人
using (System.Net.WebClient Client = new System.Net.WebClient()) 
{
    Client.Headers.Add("Content-Type", "binary/octet-stream");
    byte[] result = Client.UploadFile("http://192.168.0.52/mipzy/html/application.php", "POST", file);
    string s = System.Text.Encoding.UTF8.GetString(result, 0, result.Length); 
    MessageBox.Show(s);
}

没有二进制阅读器。如果您需要二进制阅读器,还必须为表单提供一些多部分参数。这是由UploadFile事件自动完成的。