Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Dimaskih2
0 / 0 / 0
Регистрация: 21.05.2013
Сообщений: 4
#1

Не получается отправить картинку запросом POST

21.05.2013, 13:16. Просмотров 1577. Ответов 6
Метки нет (Все метки)

Привет, замаялся уже - ну что я делаю не так?
Отправляю я это вконтакте апи. Сервер должен ответить {"server": "1234", "photo": "1234", "hash": "12345abcde"} что то подобное. А он {"server": "1234", "photo": [], "hash": "12345abcde"}. В общем не заливается фотка
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private void uploadPhoto()
        {
 
            var newLine = Environment.NewLine;
            var boundary = "---------------------------" + DateTime.Now.Ticks;
            var fileHeader = "--" + boundary + newLine +
                        "Content-Disposition: form-data; name=\"file1\"; filename=\"301217567.jpg\"" + newLine; ;
            
            //var postData = "type=base64&";
                 
 
            byte[] bytes = File.ReadAllBytes(@"D:\\vkPublic\\301217567.jpg");
            
            //string encoded = Convert.ToBase64String(bytes);
            //postData += "file1=";
 
            ///MessageBox.Show(postData);
 
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.upload_url);
            request.Credentials = CredentialCache.DefaultCredentials;
            request.Method = WebRequestMethods.Http.Post;
            request.ContentType = "multipart/form-data; boundary=" + boundary;
            request.KeepAlive = true;
            //request.ContentLength = bytes.Length + Encoding.Default.GetBytes(fileHeader + "--" + boundary + "--"+newLine);
 
           // byte[] reqData = Encoding.Default.GetBytes(postData);
            using (var reqStream = request.GetRequestStream())
            {
                var reqWriter = new StreamWriter(reqStream);
                reqWriter.Write(fileHeader);
                reqWriter.Write(bytes);
                reqWriter.Write("--" + boundary + "--"+newLine);
                reqWriter.Flush();
            }
            var res = (HttpWebResponse)request.GetResponse();
            var resStream = res.GetResponseStream();
            var reader = new StreamReader(resStream);
            string resString = reader.ReadToEnd();
            MessageBox.Show(resString);
        }

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2013, 13:16
Ответы с готовыми решениями:

Не получается отправить Post запрос
Есть сайт когда туда заходишь надо указать что тебе больше 18 и т.д. Хочу...

Проблема с POST - запросом
Вообщем есть 10 потоков, задача каждого потока - послать пост запрос, тойсть в...

Проблемы с POST запросом к сайту
Недавно меня заинтересовала возможность post запросов к сайтам. Кокретный сайт...

Отправить post запрос на JSON
Всем привет , использую WebBrowser что бы отправлять пост запросы , и для сайта...

Пытаюсь отправить сообщение методом POST
Пытаюсь отправить сообщение на форум следующим образом, но ничего не выходит, в...

6
XsauX
18 / 18 / 0
Регистрация: 17.05.2013
Сообщений: 65
21.05.2013, 14:44 #2
Ну понятно что не корректно задаете тело или заголовки пакета.
На память сейчас не скажу как нужно , но я бы тупо сравнил пакеты от браузера и от программы через снифер.
0
Dimaskih2
0 / 0 / 0
Регистрация: 21.05.2013
Сообщений: 4
21.05.2013, 17:10  [ТС] #3
Я посмотрел через снифер. ХЗ честно говоря.
Вот то что отправляет программа. Я немного дописал код

C#
1
2
  byte[] bytes = File.ReadAllBytes(@"D:\\vkPublic\\301217567.jpg");
  string encoded = Convert.ToBase64String(bytes);
В строку base64 конвертнул, потом записал в выходной поток

Вот данные POST
---------------------------635047761733987164
Content-Disposition: form-data; name="file1"; filename="301217567.jpg"
Content-Type: application/octet-stream

/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAQDAwQDAwQEAwQFBAQFBgoHBgYGBg0JCggKDw0QEA8NDw4RExgUERIXEg4PFRwVFxkZGxsbEBQdHx0aHxgaGxr/2wBDAQQFBQYFBgwHBwwaEQ8RGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaG
{Это файл....}
Submit Query
------------------------------------------------------635047761733987164--

Заголовки

(Request-Line):POST /upload.php?act=do_add&mid=211810039&aid=174433782&gid=53919828&hash=51adbf3685f32a3c8e80d3bc1a262075&rhash=e95c1f33a0a15 6dad6c410bfcf75ce9a&swfupload=1&api=1&save_big=1 HTTP/1.1
Accept:*/*
Content-Type:multipart/form-data; boundary=---------------------------635047761733987164
Host:cs417728.vk.com
Content-Length:74616
Expect:100-continue

Вроде бы все правильно. Но ответ от сервера тот же - 0 фото загружено
0
XsauX
18 / 18 / 0
Регистрация: 17.05.2013
Сообщений: 65
21.05.2013, 17:52 #4
Ну так я и говорю , нужно сравнить с пакетами браузера, он же нормально файлы постит, после чего добиться идентичных от программы.
0
Dimaskih2
0 / 0 / 0
Регистрация: 21.05.2013
Сообщений: 4
21.05.2013, 18:16  [ТС] #5
Ну тут у меня несколько вопросов возникает:

1. Имеет ли значение как генерить boundery. Сколько нужно "---" перед цифрами.

2. Как записывать файл в выходной поток. Я вот сейчас конвертирую в base64 строку. Не уверен что это есть правильно.

3. В браузере, кроме того, что там передается сама картинка, передается еще отдельно ее имя, айди альбома в который постится картинка и т.д. В документации ВК написано, что надо передать только картинку.

Я вообще думаю есть ли разница в передаче картинки через апи и заливкой через браузер?
0
XsauX
18 / 18 / 0
Регистрация: 17.05.2013
Сообщений: 65
22.05.2013, 11:03 #6
http://ru.wikipedia.org/wiki/Multipart/form-data
boundery - разделитель сообщений в пакете, как генерить пофиг. , единственное что нужно перед boundary ставить "--" и соблюдать пустые строки между описательной частью и содержимым.
Насчет base64, рекомендуется передавать именно в этой кодировке , дабы избежать проблематичных символов , которые могут быть некорректно распознаны (например почтовыми серверами)
Каким макаром постить картинку разницы нет, в конечном итоге это все равно HTTP запрос, разница лишь в том что браузер собирает пакет правильно ) , а вот ваша программа наврятли. - потому , если не знаете всех тонкостей формирования пакета и влом изучать RFC , то проще воспроизвести пакет браузера.

Добавлено через 2 минуты
http://zoo-mania.ru/csharp/multipartformdata/index.html - если нужны примеры, гугл выдает кучу готовых решений.
0
Dimaskih2
0 / 0 / 0
Регистрация: 21.05.2013
Сообщений: 4
22.05.2013, 11:13  [ТС] #7
Википедию читал - Да уж RFC читать действительно ломы. Оо, Спасибо за ссыль - вроде то что нужно.
0
22.05.2013, 11:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2013, 11:13

Отправить Post-запрос средствами XNet
Доброго суток всем. Проблема с отправлением post-запроса, средствами xNet. ...

Отправить POST-запрос через Awesomium
Здравствуйте, господа! Нужен пример отправки post запроса через Awesomium,...

Отправить POST данные через httpS
Никак не получается сделать авторизацию по защищенному протоколу. ну вот для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru