Я хочу загрузить файлы из приложения Windows C # на веб-сервер под управлением PHP.
Мне известен метод WebClient.UploadFile, но я хотел бы загрузить файл в куски, чтобы я мог отслеживать прогресс и быть в состоянии приостановить / возобновить.
Поэтому я читаю часть файла и использую метод WebClient.UploadData.
Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как получить доступ к данным, отправленным с UploadData из php. Если я сделаю 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); } }
Вот как я делаю свои 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
Использовать это. Это будет работать точно. System.Net.WebClient Client = новый 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.