web-dev-qa-db-ja.com

C#でWebサイトからファイルをダウンロードする方法

WindowsアプリケーションフォームのWebサイトからファイルをダウンロードし、特定のディレクトリに置くことは可能ですか?

61
S3THST4

WebClientクラス の場合:

using System.Net;
//...
WebClient Client = new WebClient ();
Client.DownloadFile("http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png", @"C:\folder\stackoverflowlogo.png");
111
CMS

つかいます - WebClient.DownloadFile

using (WebClient client = new WebClient())
{
    client.DownloadFile("http://csharpindepth.com/Reviews.aspx", 
                        @"c:\Users\Jon\Test\foo.txt");
}
80
Jon Skeet

ファイルのダウンロード中にステータスを確認するか、要求を行う前に資格情報を使用する必要がある場合があります。

これらのオプションをカバーする例:

Uri ur = new Uri("http://remotehost.do/images/img.jpg");

using (WebClient client = new WebClient()) {
    //client.Credentials = new NetworkCredential("username", "password");
    String credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes("Username" + ":" + "MyNewPassword"));
    client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}";

    client.DownloadProgressChanged += WebClientDownloadProgressChanged;
    client.DownloadDataCompleted += WebClientDownloadCompleted;
    client.DownloadFileAsync(ur, @"C:\path\newImage.jpg");
}

そして、コールバックの関数は次のように実装されます:

void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    Console.WriteLine("Download status: {0}%.", e.ProgressPercentage);

    // updating the UI
    Dispatcher.Invoke(() => {
        progressBar.Value = e.ProgressPercentage;
    });
}

void WebClientDownloadCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    Console.WriteLine("Download finished!");
}

(Ver 2)-ラムダ表記:イベントを処理するための他の可能なオプション

client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(delegate(object sender, DownloadProgressChangedEventArgs e) {
    Console.WriteLine("Download status: {0}%.", e.ProgressPercentage);

    // updating the UI
    Dispatcher.Invoke(() => {
        progressBar.Value = e.ProgressPercentage;
    });
});

client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(delegate(object sender, DownloadDataCompletedEventArgs e){
    Console.WriteLine("Download finished!");
});

(Ver 3)-改善できます

client.DownloadProgressChanged += (object sender, DownloadProgressChangedEventArgs e) =>
{
    Console.WriteLine("Download status: {0}%.", e.ProgressPercentage);

    // updating the UI
    Dispatcher.Invoke(() => {
        progressBar.Value = e.ProgressPercentage;
    });
};

client.DownloadDataCompleted += (object sender, DownloadDataCompletedEventArgs e) => 
{
    Console.WriteLine("Download finished!");
};

(Ver 4)-または

client.DownloadProgressChanged += (o, e) =>
{
    Console.WriteLine($"Download status: {e.ProgressPercentage}%.");

    // updating the UI
    Dispatcher.Invoke(() => {
        progressBar.Value = e.ProgressPercentage;
    });
};

client.DownloadDataCompleted += (o, e) => 
{
    Console.WriteLine("Download finished!");
};
18
Kreshnik

確かに、 HttpWebRequest を使用するだけです。

HttpWebRequestをセットアップしたら、応答ストリームをファイルStreamWriter(いずれかBinaryWriter、またはmimetypeに応じてTextWriterに保存できます。 )そして、ハードドライブにファイルがあります。

編集:WebClientを忘れました。 GETを使用してファイルを取得する必要がある場合を除き、これは適切に機能します。サイトでPOST情報が必要な場合は、HttpWebRequestを使用する必要があるため、答えは残しておきます。

13
FlySwat

このコードを使用して、WebSiteからデスクトップにファイルをダウンロードできます。

using System.Net;

WebClient Client = new WebClient ();
client.DownloadFileAsync(new Uri("http://www.Address.com/File.Zip"), Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "File.Zip");
2
Pouya

この例を試してください:

public void TheDownload(string path)
{
  System.IO.FileInfo toDownload = new System.IO.FileInfo(HttpContext.Current.Server.MapPath(path));

  HttpContext.Current.Response.Clear();
  HttpContext.Current.Response.AddHeader("Content-Disposition",
             "attachment; filename=" + toDownload.Name);
  HttpContext.Current.Response.AddHeader("Content-Length",
             toDownload.Length.ToString());
  HttpContext.Current.Response.ContentType = "application/octet-stream";
  HttpContext.Current.Response.WriteFile(patch);
  HttpContext.Current.Response.End();
} 

実装は次のように行われます。

TheDownload("@"c:\Temporal\Test.txt"");

ソース: http://www.systemdeveloper.info/2014/03/force-downloading-file-from-c.html

0
angelo

また、DownloadFileAsyncクラスでWebClientメソッドを使用できます。指定されたURIを持つリソースをローカルファイルにダウンロードします。また、このメソッドは呼び出しスレッドをブロックしません。

サンプル:

    webClient.DownloadFileAsync(new Uri("http://www.example.com/file/test.jpg"), "test.jpg");

詳細情報:

http://csharpexamples.com/download-files-synchronous-asynchronous-url-c/

0
turgay