2011-01-15 21 views
16

ありがとう、icktoofay、 HttpWebRequestHttpWebResponseを使ってみました。HttpWebRequestとHttpWebResponseクラス(Cookie、Credentialsなど)を使用してファイルをダウンロードする方法

ユーザー名とパスワードのような資格情報を渡してURLを要求するとき。

応答でセッションIDが返されます。

セッションIDを取得した後、さらに移動する方法。

認証されたユーザーは、資格情報/ Cookieを使用して追跡されます。 ダウンロードするファイルと資格情報の正確なURLがあります。 クッキーを使用したい場合、私は行います。私はファイルデータを読んで、指定された場所にそれを書き込む/保存する必要があります。

私が使用しているコードは次のとおりです。

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(); 

答えて

20

これは、私はそれを行う方法です。

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

Webサーバへの第一の方法ログインとセッション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(); 
} 

他の方法は、サーバーからファイルを取得します。

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

私は彼は文字列としてページします。ディスクに保存するには、それをバイト[]として返すほうがよいでしょう。あなたのjpegファイルが小さい(通常はサイズがギガバイトではない)場合、それらをメモリストリームに置き、ディスクに保存するだけです。上記のような危険なメモリリークの可能性がある難しいコードの30行ではなく、C#で2〜3行の単純な行が必要になります。

+0

ありがとうAles、はい、最初のメソッドを試してセッションIDとしてCookieを取得しました。そのCookieコレクションを新しいWebRequestに割り当て、ファイルURLへのリクエストを試します。iehttps://ghasghfh/filename=hasfhgfhg.mro 。私はStringフォームでレスポンスを取得しようとすると。私が得る文字列値は、ログインページのHTMLコード/ ViewSourceです。私に返信してください..本当にありがとうございました。 – Vinay

+0

あなたはウェブページのダウンロードに成功しましたが、ログインとパスワードは正しく渡されていません。私の例(string.Formatコマンドの行を参照してください)はPOSTのフォーマットを使用しています。これはサーバー上でphpを使って自分のコードを使いたいと思っていました。私は、サーバーとのすべての通信を表示するFirefoxプラグインを使い始めてから、私のコードで同じことをしました。そして、それは動作します。 –

+0

Al Kepp、U r右、ファイルのHTMLを正常にダウンロードできました。問題や問題が継続している場合の示唆。何か特別な注意が必要か。 – Vinay

関連する問題