开发者

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

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 = "";
strin开发者_运维百科g 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();


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.


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;
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜