c# httpwebrequest multipart/form-data;

попросили тут написать грабер каринок и добавление в скрипт на php. Написал на c# грабер, авторизацию в админку и отправку постом. Пришлось правда повозиться с multipart/form-data. Зато теперь можно немного изменить код и обновлять все что душе угодно, в том числе и в любом другом скрипте.

namespace RA.HTML

{

/// <summary>

/// class PostData set maf with delim ! and returned Method (post or get), Action, Param

/// </summary>

public class PostData

{

private string s_method = String.Empty;

public string Method { get { return this.s_method; } }

private string s_action = String.Empty;

public string Action { get { return this.s_action; } }

public string Param { get { return this.s_param; } }

private string s_param = String.Empty;

public PostData(string s_PostString)

{

if (s_PostString.IndexOf("=") != -1)

{

this.s_method = s_PostString.Substring(0, s_PostString.IndexOf("="));

this.s_action = s_PostString.Substring(s_PostString.IndexOf("=") + 1);

if (this.s_action.IndexOf("!") != -1)

{

this.s_action = s_action.Substring(0, this.s_action.IndexOf("!"));this.s_param = s_PostString.Substring(s_PostString.IndexOf("!") + 1);

}

}

}

public static string MultiFormData(string Key, string Value, string Boundary)

{

string output = "--" + Boundary + "\r\n"; output += "Content-Disposition: form-data; name=\"" + Key + "\"\r\n\r\n";

output += Value + "\r\n";

return output;

}

public static string MultiFormDataFile(string Key, string Value, string FileName, string FileType, string Boundary)

{

string output = "--" + Boundary + "\r\n"; output += "Content-Disposition: form-data; name=\"" + Key + "\"; filename=\"" + FileName + "\"\r\n"; output += "Content-Type: " + FileType + " \r\n\r\n";

output += Value + "\r\n";

return output;

}

}

}

 

пример использования

string sBoundary = DateTime.Now.Ticks.ToString("x");
string sPostMultiString = "";

sPostMultiString += PostData.MultiFormData("url", th.Url.ToString(), sBoundary);

if (!string.IsNullOrEmpty(th.LocalFileName))

{

sPostMultiString +=
PostData.MultiFormData("thumb_url", th.Src.ToString(), sBoundary);

}

sPostMultiString +=
PostData.MultiFormData("MAX_FILE_SIZE", "100000", sBoundary);if (!string.IsNullOrEmpty(th.LocalFileName))

{

string sFileContent = "";

using (FileStream fStream = new FileStream(th.LocalFileName, FileMode.Open, FileAccess.Read))

{

FileInfo fInfo = new FileInfo(th.LocalFileName);using (BinaryReader br = new BinaryReader(fStream, Encoding.Default))

{

byte[] ba = br.ReadBytes((int)fInfo.Length);

sFileContent = Encoding.Default.GetString(ba);

}

}

sPostMultiString +=
PostData.MultiFormDataFile("thumb_file",

sFileContent, th.LocalFileName, "image/pjpeg", sBoundary);

}

sPostMultiString += PostData.MultiFormData("desc", th.Alt, sBoundary);

sPostMultiString += PostData.MultiFormData("alt", th.Alt, sBoundary);

sPostMultiString += PostData.MultiFormData("amount", "1", sBoundary);

sPostMultiString += PostData.MultiFormData("group", "1", sBoundary);

sPostMultiString += PostData.MultiFormData("niche", "4", sBoundary);

sPostMultiString += PostData.MultiFormData("action", "add_one", sBoundary); sPostMultiString += PostData.MultiFormData("s1", "Add gallery", sBoundary);

sPostMultiString += "--" + sBoundary + "--\r\n\r\n";

!!! Единственное нужно заменить кодировку на дефолтную при отправке http web request

byte[] byteArray = Encoding.Default.GetBytes(Param);

чтобы файл правильно передался. или Stream создавать на-ходу.

Надеюсь кому пригодится

Отмеченно в: ,

Комментарии

Без комментариев

Оставьте комментарий!

(обязательно) 
(обязательно) 
(optional)
(обязательно)