ZennoPoster.HTTP.Request загрузить изображение на сервер

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Добрый день!
Вот есть POST запрос к API VK для загрузки изображения

63196

И все работает. Но... Хочется научиться в коде. С помощью ZennoPoster.HTTP.Request. Делаю так:

C#:
//адрес сервера, полученный в предыдущ запросе
string url = project.Json.response.upload_url;
//путь к файлу
string path = project.Variables["CRT_cover"].Value;
//имя файла
string file = Path.GetFileName(path);
//рандом для границ контента
string boundary = Convert.ToString(Global.Classes.rnd.Next(111111111, 999999999));

//секция контент для запроса
string content = @"------WebKitFormBoundary"+boundary+
"Content-Disposition: form-data; name=\"file\"; filename=\""+file+"\"Content-Type: image/jpeg"+
path+"-----------------"+boundary;

//Загрузка файла
var post = ZennoPoster.HTTP.Request(ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.POST,
url,
content,
"multipart/form-data",
string.Empty,
string.Empty,
respType:ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);
Получаю ошибку — Выполнение действия CSharp OwnCode: загрузка обложки. Unexpected end of stream.
Полагаю косяк непосредственно с строкой контента, а вот в чем именно не догоняю...
Буду признателен за подмогу!
 
  • Спасибо
Реакции: ZennoCat

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
в контенте нет ни одного переноса строки. И boundary используется в конце не правильно.
@"------WebKitFormBoundary"+boundary вот это всё и есть разделитель, и он должен использоваться везде такой. А в конце там вроде + два дефиса в начале должно быть, то ли в конце. Не помню уже
 
  • Спасибо
Реакции: Trader1985 и semafor

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
в контенте нет ни одного переноса строки. И boundary используется в конце не правильно.
@"------WebKitFormBoundary"+boundary вот это всё и есть разделитель, и он должен использоваться везде такой. А в конце там вроде + два дефиса в начале должно быть, то ли в конце. Не помню уже
@doc, спасибо за подсказку с boundary, наконец-то порылся по RFC и более-менее уяснил формат.
Но... Вот не хочет и все через ZennoPoster.HTTP.Request отправлять...
При этом, прекрасно улетело через ZennoPoster.HttpPost. Окночательный вариант такой вышел:

C#:
//адрес сервера, полученный в предыдущ запросе
string url = project.Json.response.upload_url;
//путь к файлу
string path = project.Variables["CRT_cover"].Value;
//имя файла
string file = Path.GetFileName(path);
//рандом для границ контента
string boundary = Convert.ToString(Global.Classes.rnd.Next(111111111, 999999999));

//секция контент для запроса
string content = @"------WebKitFormBoundary"+boundary+
    @"------WebKitFormBoundary"+boundary+
    "Content-Disposition: form-data; name=\"file\"; filename=\""+file+
    @"------WebKitFormBoundary"+boundary+
    "\"Content-Type: image/jpeg"+
    @"------WebKitFormBoundary"+boundary+
    path+
    @"------WebKitFormBoundary"+boundary+"--";

//Загрузка файла
var post = ZennoPoster.HttpPost(
url,
content,
"multipart/form-data",
string.Empty,
string.Empty,
ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);
В ответ на запрос сервер возвращает в ответе JSON-объект с полями hash и photo, как описано в VK-шном мануале.

НО... При сохранении файла методом API получаю ответ error 129, "Invalid photo: file not found." VK Данную ошибку описывает как "Недопустимый формат фотографии", хотя я читаю что не найден файл.
При этом кубиком по-прежнему фото прекрасно грузится. Что ломается в фото, не понимаю!
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
@doc, спасибо за подсказку с boundary, наконец-то порылся по RFC и более-менее уяснил формат.
Но... Вот не хочет и все через ZennoPoster.HTTP.Request отправлять...
При этом, прекрасно улетело через ZennoPoster.HttpPost. Окночательный вариант такой вышел:

C#:
//адрес сервера, полученный в предыдущ запросе
string url = project.Json.response.upload_url;
//путь к файлу
string path = project.Variables["CRT_cover"].Value;
//имя файла
string file = Path.GetFileName(path);
//рандом для границ контента
string boundary = Convert.ToString(Global.Classes.rnd.Next(111111111, 999999999));

//секция контент для запроса
string content = @"------WebKitFormBoundary"+boundary+
    @"------WebKitFormBoundary"+boundary+
    "Content-Disposition: form-data; name=\"file\"; filename=\""+file+
    @"------WebKitFormBoundary"+boundary+
    "\"Content-Type: image/jpeg"+
    @"------WebKitFormBoundary"+boundary+
    path+
    @"------WebKitFormBoundary"+boundary+"--";

//Загрузка файла
var post = ZennoPoster.HttpPost(
url,
content,
"multipart/form-data",
string.Empty,
string.Empty,
ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);
В ответ на запрос сервер возвращает в ответе JSON-объект с полями hash и photo, как описано в VK-шном мануале.

НО... При сохранении файла методом API получаю ответ error 129, "Invalid photo: file not found." VK Данную ошибку описывает как "Недопустимый формат фотографии", хотя я читаю что не найден файл.
При этом кубиком по-прежнему фото прекрасно грузится. Что ломается в фото, не понимаю!
сравнивай в сниффере, что отсылается в удачном и неудачном варианте. Разница и будет ответом
 

porileenvej

Client
Регистрация
09.05.2020
Сообщения
99
Благодарностей
130
Баллы
33
@doc, спасибо за подсказку с boundary, наконец-то порылся по RFC и более-менее уяснил формат.
Но... Вот не хочет и все через ZennoPoster.HTTP.Request отправлять...
При этом, прекрасно улетело через ZennoPoster.HttpPost. Окночательный вариант такой вышел:

C#:
//адрес сервера, полученный в предыдущ запросе
string url = project.Json.response.upload_url;
//путь к файлу
string path = project.Variables["CRT_cover"].Value;
//имя файла
string file = Path.GetFileName(path);
//рандом для границ контента
string boundary = Convert.ToString(Global.Classes.rnd.Next(111111111, 999999999));

//секция контент для запроса
string content = @"------WebKitFormBoundary"+boundary+
    @"------WebKitFormBoundary"+boundary+
    "Content-Disposition: form-data; name=\"file\"; filename=\""+file+
    @"------WebKitFormBoundary"+boundary+
    "\"Content-Type: image/jpeg"+
    @"------WebKitFormBoundary"+boundary+
    path+
    @"------WebKitFormBoundary"+boundary+"--";

//Загрузка файла
var post = ZennoPoster.HttpPost(
url,
content,
"multipart/form-data",
string.Empty,
string.Empty,
ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);
В ответ на запрос сервер возвращает в ответе JSON-объект с полями hash и photo, как описано в VK-шном мануале.

НО... При сохранении файла методом API получаю ответ error 129, "Invalid photo: file not found." VK Данную ошибку описывает как "Недопустимый формат фотографии", хотя я читаю что не найден файл.
При этом кубиком по-прежнему фото прекрасно грузится. Что ломается в фото, не понимаю!
Смотри что ты отправляешь
Попробуй этот код
C#:
//ссылки из GAC добавить System.Web

string filePath = @"путь к файлу";
string output = "";
string boundary = "----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x");

string url = "";

if(System.IO.File.Exists(filePath)){
    FileInfo strFileInfo = new FileInfo(filePath);
    string fileName = strFileInfo.Name;
    string fileType = System.Web.MimeMapping.GetMimeMapping(filePath);
    output += boundary+"\r\n";
    output += string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n", "file", fileName);
    output += string.Format("Content-Type: {0}\r\n\r\n", fileType);
    output += string.Format("{0}\r\n", filePath);
}
output += boundary+"--";

var post = ZennoPoster.HttpPost(
    url,
    output,
    "multipart/form-data",
    string.Empty,
    string.Empty,
    ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly
);
 
  • Спасибо
Реакции: Ancestright77 и semafor

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Во, блин-гоблин!
Глаза уже в дулю сворачиваются... Поснифал, увидел что при отправке через кубик картиночка прилагается:

63225

А при отправке через код нет:

63226


На последней картинке подрихтовал контент с написанного в предыдущем посте на такой (по аналогии с кубиком):

C#:
string content = @"------WebKitFormBoundary"+boundary+
    "Content-Disposition: form-data; name=\"file\"; filename=\""+file+"\""+   
    "\"Content-Type: image/jpeg"+   
    path+
    "------WebKitFormBoundary"+boundary+"--";
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Смотри что ты отправляешь
Ага уже увидел.
ПОчти то же слепил, только в монструозном виде:

C#:
string content = @"------WebKitFormBoundary"+boundary+"\n"+
    "Content-Disposition: form-data; name=\"file\"; filename=\""+file+"\""+"\n"+  
    "\"Content-Type: image/jpeg"+"\n"+  
    path+"\n"+
    "------WebKitFormBoundary"+boundary+"--";
Спасибо, други!
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Осталось собсно, с ZennoPoster.HTTP.Request разобраться, но пожалуй уже на завтра отложу...
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)