Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Download the File using HttpWebRequest and HttpWebResponse class(Cookies,Credentials,etc.)

Tags:

c#

winforms

Thanks icktoofay, I tried using HttpWebRequest and HttpWebResponse.

When I request for URL by passing the Credentials like UserName And Password.

I will get the Session Id Back in the Response.

After getting that Session Id, How to Move Further.

The authenticated user are tracked using credentials/cookies. I'm Having the Exact Url of the File to be downloaded and credentials. If you want to use Cookies I will. I need to read the File Data and write/save it in a Specified Location.

The code I'm using is;

string username = "";
string password = "";
string reqString = "https://xxxx.com?FileNAme=asfhasf.mro" + "?" + 
             "username=" + username + &password=" + password;
byte[] requestData = Encoding.UTF8.GetBytes(reqString);
string s1;
CookieContainer cc = new CookieContainer();

var request = (HttpWebRequest)WebRequest.Create(loginUri);
request.Proxy = null;
request.CookieContainer = cc;
request.Method = "POST";
HttpWebResponse ws = (HttpWebResponse)request.GetResponse();
Stream str = ws.GetResponseStream();
//ws.Cookies
//var request1 = (HttpWebRequest)WebRequest.Create(loginUri);
 byte[] inBuf = new byte[100000];
int bytesToRead = (int) inBuf.Length;
int bytesRead = 0;
while (bytesToRead > 0) 
{
    int n = str.Read(inBuf, bytesRead,bytesToRead);
    if (n==0)
    break;
    bytesRead += n;
    bytesToRead -= n;
}
FileStream fstr = new FileStream("weather.jpg", FileMode.OpenOrCreate, 
                                     FileAccess.Write);
fstr.Write(inBuf, 0, bytesRead);
str.Close();
fstr.Close();
like image 771
Vinay Avatar asked Jan 15 '11 13:01

Vinay


2 Answers

This is how I do it:

const string baseurl = "http://www.some......thing.com/";
CookieContainer cookie;

The first method logins to web server and gets session id:

public Method1(string user, string password) {
  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(baseurl);

  req.Method = "POST";
  req.ContentType = "application/x-www-form-urlencoded";
  string login = string.Format("go=&Fuser={0}&Fpass={1}", user, password);
  byte[] postbuf = Encoding.ASCII.GetBytes(login);
  req.ContentLength = postbuf.Length;
  Stream rs = req.GetRequestStream();
  rs.Write(postbuf,0,postbuf.Length);
  rs.Close();

  cookie = req.CookieContainer = new CookieContainer();

  WebResponse resp = req.GetResponse();
  resp.Close();
}

The other method gets the file from server:

string GetPage(string path) {
  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(path);
  req.CookieContainer = cookie;
  WebResponse resp = req.GetResponse();
  string t = new StreamReader(resp.GetResponseStream(), Encoding.Default).ReadToEnd();
  return IsoToWin1250(t);
}

Note that I return the page as string. You would probably better return it as bytes[] to save to disk. If your jpeg files are small (they usually are not gigabyte in size), you can simply put them to memory stream, and then save to disk. It will take some 2 or 3 simple lines in C#, and not 30 lines of tough code with potential dangerous memory leaks like you provided above.

like image 145
Al Kepp Avatar answered Nov 16 '22 16:11

Al Kepp


public override DownloadItems GetItemStream(string itemID, object config = null, string downloadURL = null, string filePath = null, string)
    {
        DownloadItems downloadItems = new DownloadItems();
        try
        {
            if (!string.IsNullOrEmpty(filePath))
            {
                using (FileStream fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write))
                {
                    if (!string.IsNullOrEmpty(downloadURL))
                    {
                        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadURL);
                        request.Method = WebRequestMethods.Http.Get;
                        request.PreAuthenticate = true;
                        request.UseDefaultCredentials = true;
                        const int BUFFER_SIZE = 16 * 1024;
                        {
                            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                            {
                                using (var responseStream = response.GetResponseStream())
                                {
                                    var buffer = new byte[BUFFER_SIZE];
                                    int bytesRead;
                                    do
                                    {
                                        bytesRead = responseStream.Read(buffer, 0, BUFFER_SIZE);
                                        fileStream.Write(buffer, 0, bytesRead);
                                    } while (bytesRead > 0);
                                }
                            }
                            fileStream.Close();
                            downloadItems.IsSuccess = true;
                        }
                    }
                    else
                        downloadItems.IsSuccess = false;
                }
            }
        }
        catch (Exception ex)
        {
            downloadItems.IsSuccess = false;
            downloadItems.Exception = ex;
        }
        return downloadItems;
    }
like image 2
anju singh Avatar answered Nov 16 '22 17:11

anju singh