Witam.
Otoz napisalem skrypt jaki wysyla POST zapytanie do serwera, dokladniej to jest upload pliku na filesonic z logowaniem.
Problem polega na tym ze gdy wysylam plik nawet 30mb to wykorzystanie pamieci drastycznie wzrasta. Moj program wysyla n ilosc plikow na serwer Od razu w roznych watkach po prostu jak wrzucam cos o wielkosci np. 300mb ( 2 pliki na raz ) wyskakuja mi bledy OutOfMemory.
Oto moj kod:
byte[] ByteArr;
HttpWebRequest req;
HttpWebResponse res;
string sQueryString = "", page;
StreamReader myStreamReader;
req = (HttpWebRequest)HttpWebRequest.Create("http://www.filesonic.com/user/login");
req.AllowWriteStreamBuffering = false;
sQueryString = "email=" + userName + "&password=" + password + "&redirect=/";
req.AllowAutoRedirect = true;
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.CookieContainer = new CookieContainer();
req.CookieContainer.Add(new Uri("http://www.filesonic.com/"), new Cookie("email", userName));
req.CookieContainer.Add(new Uri("http://www.filesonic.com/"), new Cookie("password", password));
req.Referer = "http://filesonic.com/";
ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);
req.ContentLength = ByteArr.Length;
req.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
req.GetRequestStream().Close();
sQueryString = "";
req.Headers.Clear();
res = (HttpWebResponse)req.GetResponse();
myStreamReader = new StreamReader(res.GetResponseStream(), Encoding.GetEncoding(1251));
page = myStreamReader.ReadToEnd();
myStreamReader.Close();
res.Close();
CookieContainer cookies = req.CookieContainer;
WebHeaderCollection headers = req.Headers;
byte[] filebytes = File.ReadAllBytes(fName);
string file = Convert.ToBase64String(filebytes);
req = (HttpWebRequest)HttpWebRequest.Create("http://s90.filesonic.com/");
req.AllowAutoRedirect = false;
req.ReadWriteTimeout = 999999999;
req.Timeout = 999999999;
req.Method = "POST";
req.Host = "s90.filesonic.com";
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.18) Gecko/20110319 Firefox/3.5.18 (.NET CLR 3.5.30729) WebMoney Advisor";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Headers.Add("Accept-Encoding", "Accept-Encoding:deflate, gzip, x-gzip, identity, *;q=0");
req.Headers.Add("Keep-Alive", "300");
req.KeepAlive = true;
req.Referer = "http://filesonic.com/";
req.CookieContainer = cookies;
req.ContentType = "multipart/form-data; boundary=----------b7X0S7Mfbmnx7HzPYokr4k";
sQueryString = "------------b7X0S7Mfbmnx7HzPYokr4k\r\n" +
"Content-Disposition: form-data; name=\"folderId\"\r\n\r\n" +
"0" +
"\r\n------------b7X0S7Mfbmnx7HzPYokr4k\r\nContent-Disposition: form-data; name=\"files[]\"; filename=\"" +
Path.GetFileName(fName) + "\"\r\n" +
"Content-Type: application/octet-stream\r\n\r\n" +
file + "\r\n" +
"------------b7X0S7Mfbmnx7HzPYokr4k--\r\n\r\n";
ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);
req.ContentLength = ByteArr.Length;
req.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
req.GetRequestStream().Close();
res = (HttpWebResponse)req.GetResponse();
res.Cookies = req.CookieContainer.GetCookies(new Uri("http://filesonic.com"));
res.Close();
I teraz moje pytanie jak mozna przerobic kod zeby wysylac plik czesciami, ale tak zeby doszedl do serwera i serwer jego zaakceptowal ? moze Chunked ? tylko nie wiem jak to wykorzystac, czy mogl by ktos mi pomoc i podpowiedziec lub przerobic ten kodzik ? :)
Z Gory dziekuje.
Pozdrawiam.
Sergiusz.