PUT multipart запрос на C#

VadymS

Client
Регистрация
27.09.2015
Сообщения
92
Благодарностей
19
Баллы
8
Собственно, PUT запросы на C# я отправляю без проблем. И тут прописал Content-Type и т.д.
Но как правильно прописать сами данные?:

Код:
------WebKitFormBoundaryoGlNFdqxHPBEZSDG
Content-Disposition: form-data; name="user[avatar_data]"; filename="blob"
Content-Type: image/jpeg

D:\vot.png

------WebKitFormBoundaryoGlNFdqxHPBEZSDG--
Честно потратил 7 часов на ресерч. Наверное туплю или это реально сложно. Подскажите пожалуйста))
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Средствами зенно пут запрос не делается, а значит, вместо пути к файлу D:\vot.png должны быть данные самого файла
 
  • Спасибо
Реакции: VadymS

VadymS

Client
Регистрация
27.09.2015
Сообщения
92
Благодарностей
19
Баллы
8
агаааа..... я понял.

Спасибо что уделили внимание :-)
 

Troll_UA

Client
Регистрация
11.04.2016
Сообщения
121
Благодарностей
38
Баллы
28
Собственно, PUT запросы на C# я отправляю без проблем. И тут прописал Content-Type и т.д.
Но как правильно прописать сами данные?:

Код:
------WebKitFormBoundaryoGlNFdqxHPBEZSDG
Content-Disposition: form-data; name="user[avatar_data]"; filename="blob"
Content-Type: image/jpeg

D:\vot.png

------WebKitFormBoundaryoGlNFdqxHPBEZSDG--
Честно потратил 7 часов на ресерч. Наверное туплю или это реально сложно. Подскажите пожалуйста))
Смотри здесь пример PUT запроса.
 

VadymS

Client
Регистрация
27.09.2015
Сообщения
92
Благодарностей
19
Баллы
8
спасибо, с запросом проблем нет. Я файл не могу отправить (Multipart PUT request)
 

gonzo

Client
Регистрация
09.09.2009
Сообщения
32
Благодарностей
28
Баллы
18
Короче, пол-года назад мне тоже подобная хрень понадобилась (заливка аватарки методом put).
Два дня я гуглил, перелопатил кучу stack overflow, и родил некий индус-стайл говнокод :D

Код:
string url = project.Variables["url"].Value; //урл
string file = @project.Variables["avatar"].Value; //файл
string paramName = "user[avatar_data]"; //название парамерта для файла
string contentType = "image/jpeg"; //тип данных
string useragent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
string prx = project.Variables["proxy"].Value;
WebProxy myproxy = new WebProxy(prx , false);
string authorization = project.Variables["autorization"].Value;


var nvc = new System.Collections.Specialized.NameValueCollection(); //дополнительные поля
/////////////////////////////////////////////////////////////////////////////////////////
string boundary = "----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x");
byte[] boundarybytes = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
var wr = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
wr.Host = "site.com";
//wr.Connection = "keep-alive";
wr.Accept = "application/json, text/javascript, */*; q=0.01";
wr.UserAgent = useragent;
wr.Headers.Add("Authorization", authorization);
wr.Headers.Add("Accept-Encoding","gzip, deflate, br");
wr.Headers.Add("Accept-Language","ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
wr.ContentType = "multipart/form-data; boundary=" + boundary;
wr.Referer = "https://site.com/";
wr.Proxy = myproxy;
wr.Method = "PUT";
wr.KeepAlive = true;
wr.Expect = "";
//wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
//wr.KeepAlive = false;
var rs = wr.GetRequestStream();
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach (string key in nvc.Keys)
{
    rs.Write(boundarybytes, 0, boundarybytes.Length);
    string formitem = string.Format(formdataTemplate, key, nvc[key]);
    byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    rs.Write(formitembytes, 0, formitembytes.Length);
}
rs.Write(boundarybytes, 0, boundarybytes.Length);
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"blob\"\r\nContent-Type: {2}\r\n\r\n";
string header = string.Format(headerTemplate, paramName, file, contentType);
byte[] headerbytes = Encoding.UTF8.GetBytes(header);
rs.Write(headerbytes, 0, headerbytes.Length);
var fileStream = new System.IO.FileStream(file, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) {
    rs.Write(buffer, 0, bytesRead);
}
fileStream.Close();
byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
rs.Write(trailer, 0, trailer.Length);
rs.Close();
System.Net.WebResponse wresp = null;
try {
    wresp = wr.GetResponse();
    Stream stream2 = wresp.GetResponseStream();
    StreamReader reader2 = new StreamReader(stream2);
    return(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd()));
   
}

catch(Exception ex) {
    project.SendErrorToLog("Error uploading file " + ex.Message);
    if(wresp != null) {
        wresp.Close();
        wresp = null;
    }
} finally {
    wr = null;
}
Сейчас смотрю на эту конструкцию и нихрена не понимаю. Но она работает)

Так, что если ты сейчас уже кучу всего перерыл, то и тут разберешься

P.S. Еще, в using прописал (толи для этого кода, толи для другого:ca:):

using System.Web;
using System.Net;
 
  • Спасибо
Реакции: andrey-ka, Sanekk и VadymS

nole

Client
Регистрация
19.11.2010
Сообщения
368
Благодарностей
217
Баллы
43
Неужели этот сайт еще не добили? :D помню тоже дня два гуглил
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Короче, пол-года назад мне тоже подобная хрень понадобилась (заливка аватарки методом put).
Два дня я гуглил, перелопатил кучу stack overflow, и родил некий индус-стайл говнокод :D

Код:
string url = project.Variables["url"].Value; //урл
string file = @project.Variables["avatar"].Value; //файл
string paramName = "user[avatar_data]"; //название парамерта для файла
string contentType = "image/jpeg"; //тип данных
string useragent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
string prx = project.Variables["proxy"].Value;
WebProxy myproxy = new WebProxy(prx , false);
string authorization = project.Variables["autorization"].Value;


var nvc = new System.Collections.Specialized.NameValueCollection(); //дополнительные поля
/////////////////////////////////////////////////////////////////////////////////////////
string boundary = "----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x");
byte[] boundarybytes = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
var wr = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
wr.Host = "site.com";
//wr.Connection = "keep-alive";
wr.Accept = "application/json, text/javascript, */*; q=0.01";
wr.UserAgent = useragent;
wr.Headers.Add("Authorization", authorization);
wr.Headers.Add("Accept-Encoding","gzip, deflate, br");
wr.Headers.Add("Accept-Language","ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
wr.ContentType = "multipart/form-data; boundary=" + boundary;
wr.Referer = "https://site.com/";
wr.Proxy = myproxy;
wr.Method = "PUT";
wr.KeepAlive = true;
wr.Expect = "";
//wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
//wr.KeepAlive = false;
var rs = wr.GetRequestStream();
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach (string key in nvc.Keys)
{
    rs.Write(boundarybytes, 0, boundarybytes.Length);
    string formitem = string.Format(formdataTemplate, key, nvc[key]);
    byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    rs.Write(formitembytes, 0, formitembytes.Length);
}
rs.Write(boundarybytes, 0, boundarybytes.Length);
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"blob\"\r\nContent-Type: {2}\r\n\r\n";
string header = string.Format(headerTemplate, paramName, file, contentType);
byte[] headerbytes = Encoding.UTF8.GetBytes(header);
rs.Write(headerbytes, 0, headerbytes.Length);
var fileStream = new System.IO.FileStream(file, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) {
    rs.Write(buffer, 0, bytesRead);
}
fileStream.Close();
byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
rs.Write(trailer, 0, trailer.Length);
rs.Close();
System.Net.WebResponse wresp = null;
try {
    wresp = wr.GetResponse();
    Stream stream2 = wresp.GetResponseStream();
    StreamReader reader2 = new StreamReader(stream2);
    return(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd()));
  
}

catch(Exception ex) {
    project.SendErrorToLog("Error uploading file " + ex.Message);
    if(wresp != null) {
        wresp.Close();
        wresp = null;
    }
} finally {
    wr = null;
}
Сейчас смотрю на эту конструкцию и нихрена не понимаю. Но она работает)

Так, что если ты сейчас уже кучу всего перерыл, то и тут разберешься

P.S. Еще, в using прописал (толи для этого кода, толи для другого:ca:):

using System.Web;
using System.Net;
нихера ты наркоман))))
я так тоже кодил в первые дни работы с httpwebrequst, но сейчас твой код можно было бы уменьшить раза в 2-3
 

gonzo

Client
Регистрация
09.09.2009
Сообщения
32
Благодарностей
28
Баллы
18
Неужели этот сайт еще не добили? :D помню тоже дня два гуглил
Почти добили, если мы об одном и том же))

нихера ты наркоман))))
я так тоже кодил в первые дни работы с httpwebrequst, но сейчас твой код можно было бы уменьшить раза в 2-3
Зато сам))
 
  • Спасибо
Реакции: VadymS

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Через Webclient загрузите методом

WebClient.UploadFile(url, "PUT", filePath)

В header content-type подставьте multipart или какой у вас там тип отправляемых данных
 
  • Спасибо
Реакции: VadymS

VadymS

Client
Регистрация
27.09.2015
Сообщения
92
Благодарностей
19
Баллы
8
Короче, пол-года назад мне тоже подобная хрень понадобилась (заливка аватарки методом put).
Два дня я гуглил, перелопатил кучу stack overflow, и родил некий индус-стайл говнокод :D

Код:
string url = project.Variables["url"].Value; //урл
string file = @project.Variables["avatar"].Value; //файл
string paramName = "user[avatar_data]"; //название парамерта для файла
string contentType = "image/jpeg"; //тип данных
string useragent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
string prx = project.Variables["proxy"].Value;
WebProxy myproxy = new WebProxy(prx , false);
string authorization = project.Variables["autorization"].Value;


var nvc = new System.Collections.Specialized.NameValueCollection(); //дополнительные поля
/////////////////////////////////////////////////////////////////////////////////////////
string boundary = "----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x");
byte[] boundarybytes = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
var wr = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
wr.Host = "site.com";
//wr.Connection = "keep-alive";
wr.Accept = "application/json, text/javascript, */*; q=0.01";
wr.UserAgent = useragent;
wr.Headers.Add("Authorization", authorization);
wr.Headers.Add("Accept-Encoding","gzip, deflate, br");
wr.Headers.Add("Accept-Language","ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
wr.ContentType = "multipart/form-data; boundary=" + boundary;
wr.Referer = "https://site.com/";
wr.Proxy = myproxy;
wr.Method = "PUT";
wr.KeepAlive = true;
wr.Expect = "";
//wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
//wr.KeepAlive = false;
var rs = wr.GetRequestStream();
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach (string key in nvc.Keys)
{
    rs.Write(boundarybytes, 0, boundarybytes.Length);
    string formitem = string.Format(formdataTemplate, key, nvc[key]);
    byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    rs.Write(formitembytes, 0, formitembytes.Length);
}
rs.Write(boundarybytes, 0, boundarybytes.Length);
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"blob\"\r\nContent-Type: {2}\r\n\r\n";
string header = string.Format(headerTemplate, paramName, file, contentType);
byte[] headerbytes = Encoding.UTF8.GetBytes(header);
rs.Write(headerbytes, 0, headerbytes.Length);
var fileStream = new System.IO.FileStream(file, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) {
    rs.Write(buffer, 0, bytesRead);
}
fileStream.Close();
byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
rs.Write(trailer, 0, trailer.Length);
rs.Close();
System.Net.WebResponse wresp = null;
try {
    wresp = wr.GetResponse();
    Stream stream2 = wresp.GetResponseStream();
    StreamReader reader2 = new StreamReader(stream2);
    return(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd()));
 
}

catch(Exception ex) {
    project.SendErrorToLog("Error uploading file " + ex.Message);
    if(wresp != null) {
        wresp.Close();
        wresp = null;
    }
} finally {
    wr = null;
}
Сейчас смотрю на эту конструкцию и нихрена не понимаю. Но она работает)

Так, что если ты сейчас уже кучу всего перерыл, то и тут разберешься

P.S. Еще, в using прописал (толи для этого кода, толи для другого:ca:):

using System.Web;
using System.Net;
то что нужно! спасибо огромное)))
:bp::bo:
я тоже собирал с stackoverflow и github но у меня работающего варианта так и не получилось.
спасибо гонзо!
сайт тоже SC да?:D
 

gonzo

Client
Регистрация
09.09.2009
Сообщения
32
Благодарностей
28
Баллы
18
Он самый. Только че ты там выжать еще хочешь, хз. Я уже его задрюкал по самое немогу))
По третьему кругу всех пользователей прохожу. Их там лямов 80. Активных - слезы

Плюс рега пост-гетом сейчас не получается. Они добавили на днях еще параметр, который хз откуда взять-сгенерить
 

VadymS

Client
Регистрация
27.09.2015
Сообщения
92
Благодарностей
19
Баллы
8
Он самый. Только че ты там выжать еще хочешь, хз. Я уже его задрюкал по самое немогу))
По третьему кругу всех пользователей прохожу. Их там лямов 80. Активных - слезы

Плюс рега пост-гетом сейчас не получается. Они добавили на днях еще параметр, который хз откуда взять-сгенерить
я регал раньше браузером, и рекапчу человек решал.
сейчас с рукапчей интегрирую, на запросах недели две назад регу набросал -- работала. Застопорился на этом ПУТ. Вобщем если сделаю регу -- напишу в личку решение.
 

Slava

Client
Регистрация
17.07.2015
Сообщения
36
Благодарностей
4
Баллы
8
Подскажите путь к файлу здесь - <<string file = @project.Variables["avatar"].Value; //файл>> ?
В переменной проекта "avatar" прописывался у вас? ищу способ картинку передать тоже
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Подскажите путь к файлу здесь - <<string file = @project.Variables["avatar"].Value; //файл>> ?
В переменной проекта "avatar" прописывался у вас? ищу способ картинку передать тоже
string file = project.Variables["avatar"].Value; //файл
все верно, кроме собаки, она там не нужна.
 
  • Спасибо
Реакции: Slava

yriy158

Client
Регистрация
10.08.2013
Сообщения
491
Благодарностей
303
Баллы
63
А можете кто-то шаблон скинуть с оформленным PUT-запросом? Ибо прочитал много, но ничего не получается, хотелось бы взглянуть на вариант, который у кого-то 100% работает.
 

VadymS

Client
Регистрация
27.09.2015
Сообщения
92
Благодарностей
19
Баллы
8
А можете кто-то шаблон скинуть с оформленным PUT-запросом? Ибо прочитал много, но ничего не получается, хотелось бы взглянуть на вариант, который у кого-то 100% работает.
вот из моего проекта, с прокси (https)
Код:
var request = (HttpWebRequest) WebRequest.Create("https://site.com/info");
request.Method = "PUT";
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = project.Variables["user_agent"].Value;
request.Headers.Add("token1", project.Variables["token1"].Value);
request.Headers.Add("token2", project.Variables["token2"].Value);
request.Headers.Add("Authorization", project.Variables["Authorization"].Value);

WebProxy myproxy = new WebProxy(project.Variables["proxy"].Value, false);
request.Proxy = myproxy;

var writer = new StreamWriter(request.GetRequestStream());
writer.Write("do=action");
writer.Flush();
writer.Close();

var response = (HttpWebResponse)request.GetResponse();
response.Close();
 
  • Спасибо
Реакции: samsonnn и one

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113

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