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
создавать на-ходу.
Надеюсь кому пригодится