Составляю multipart/form-data запрос с отправкой изображения. Подскажите, как верно считать само изображение. Сейчас использую такую конструкцию Code: string sFileContent = ""; Stream fStream = null; fStream = File.OpenRead(photo_name); int nread; try { byte[] buffer = new byte[4096]; while ((nread = fStream.Read(buffer, 0, 4096)) != 0) sFileContent += Encoding.Default.GetString(buffer); fStream.Close(); }
Если чесно, плохо представляю, как подладить этот кусок кода под мой код. Там в base64 конвертится бинарник картинки, а мне без этого нужно.. Сори за тупизм, учусь еще только. Вот мой код Code: string sFileContent = ""; Stream fStream = null; fStream = File.OpenRead(photo_name); int nread; try { byte[] buffer = new byte[4096]; while ((nread = fStream.Read(buffer, 0, 4096)) != 0) sFileContent += Encoding.UTF8.GetString(buffer); fStream.Close(); } catch (Exception exc) { Console.WriteLine(exc.Message); } //rwriteln(sFileContent); using (var requestStream = request.GetRequestStream()) using (var writer = new StreamWriter(requestStream)) { //if (g == 0) //{ writer.WriteLine("--" + boundary); writer.WriteLine(string.Format("Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"", photo_name)); writer.WriteLine(string.Format("Content-Type: image/jpeg")); writer.WriteLine(); writer.WriteLine(sFileContent); //g++; //} foreach (var item in data) { writer.WriteLine("--" + boundary); writer.WriteLine(string.Format("Content-Disposition: form-data; name=\"{0}\"", item.Key)); writer.WriteLine(); writer.WriteLine(item.Value); } writer.WriteLine("--" + boundary + "--"); } using (var response = request.GetResponse()) using (var responseStream = response.GetResponseStream()) using (var reader = new StreamReader(responseStream)) { html = reader.ReadToEnd(); } Вот в такой кодировке должна получиться картинка в оригинале а вот такое получается у меня
Ну ты приводишь двоичные данные к UTF-8 строке, чему собственно удивляться? Делай все в byte[], как и должно быть, без всяких привидений к строке.
Code: sFileContent += Encoding.UTF8.GetString(buffer); Code: sFileContent += Encoding.ASCII.GetString(buffer);
На глаз, у обоих вариантов кодировки отличаются от оригинала, да и запрос не проходит. без конверсии в поток выводятся "байты" = набор цифр
интересно, а как это байтовые приблуды бросаются по хттп? ничего, что обязательно надо конвертить в бэйс64, чтобы левых символов не было?
Ты сильно, сильно заблуждаешься, никакое преобразования в base64 не является обязательным. Главное что бы bondary был уникальным. И все в конечно итоге идет в "байтовых приблудах". [SMD] - пиши все в массиве байт. Сначала переводи текст в System.Text.Encoding.UTF8.GetBytes(можешь делать Url кодирования все что выше 127 и не печатные символы, кроме конечно CRLF) в массив. Затем используй File.ReadAllBytes для того что бы считать содержимое изображения. Можешь использовать MemoryStream для объединения всего в один массив байт.
Объяснит кто, в чем проблема? В консольном режиме нажимаю ctr+c, получаю Стоит Microsoft Visual C# 2010 Express Код Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; class Program { static void Main(string[] args) { Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress); Console.ReadLine(); Console.ReadLine(); } static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) { Console.WriteLine("\a\a\a\a\a\a\a"); } }
wkololo4ever, возможно, ctrl+c закрывает консоль быстрее чем запустится обработчик события и он успеет пикнуть... Попробуй в Console_CancelKeyPress засунуть e.Cancel = true;
Вопрос по формам, потокобезопасные вызовы. Делаю так: Form1.cs: Code: public static Label staticLabel; public delegate void changeControlVisibility(Control ctrl, bool state); public static void iSetControlVisibility(Control ctrl, bool state) { if(state) ctrl.Visible = true; else ctrl.Visible = false; } private void Form1_Load(object sender, EventArgs e) { staticLabel = someLabel; } Другая форма... Code: if(Form1.staticLabel.InvokeRequired) { Form1.changeControlVisibility deleg = new Form1.changeControlVisibility(Form1.iSetControlVisibility); //вот тут... действительно ли надо Invo-кать вот так ? выглядит немного абсурдно.. Form1.staticLabel.Invoke(deleg, new object[] { Form1.staticLabel, false }); } И вообще, такой подход для обеспечения потокобезопасности в формах адекватен ?
DeepBlue7 правильней будет реализовать это через события. Создай на другой форме события, а в Form1 подписывайся на него и через аргументы события смотри что да как.