WebClient.DownloadFile与WebClient.DownloadData

时间:2011-07-10 03:47:55

标签: c# webclient

我正在使用WebClient.DownloadFile从互联网上下载一个小型可执行文件。这种方法非常有效。但是,我现在想将此可执行文件下载到字节数组而不是我的硬盘驱动器上。我做了一些阅读并遇到了WebClient.DownloadData方法。我使用downloadData方法的问题是,而不是下载我的文件,我的代码正在下载我文件下载页面后面的HTML数据。

我尝试过使用过几十个网站 - 每个网站都给我带来了同样的问题。以下是我正在使用的代码。

// Create a new instance of the System.Net 'WebClient'
        System.Net.WebClient client = new System.Net.WebClient();

        // Download URL
        Uri uri = new Uri("http://www35.multiupload.com:81/files/4D7B4D2BFC3F1A9F765A433BA32ED2C5883D0CE133154A0FDB7E7786547A3165DA62393141C4AF8FF36C75222566CF3EB64AF6FBCFC02099BB209C891529CF7B90C83D9C63D39D989CBB8ECE6DE2B83B/Project1.exe");

        byte[] dbytes = client.DownloadData(uri);

        MessageBox.Show(dbytes.Length.ToString()); // Not the size of my file

请记住,我正在尝试将可执行文件的数据下载到字节数组中。

感谢您的帮助, 埃文

2 个答案:

答案 0 :(得分:2)

您正在尝试使用过期的令牌网址下载文件。见下文:

网址:http://www35.multiupload.com:81/files/4D7B4D2BFC3F1A9F765A433BA32ED2C5883D0CE133154A0FDB7E7786547A3165DA62393141C4AF8FF36C75222566CF3EB64AF6FBCFC02099BB209C891529CF7B90C83D9C63D39D989CBB8ECE6DE2B83B/Project1.exe`

服务器:www35

令牌: 4D7B4D2BFC3F1A9F765A433BA32ED2C5883D0CE133154A0FDB7E7786547A3165DA62393141C4AF8FF36C75222566CF3EB64AF6FBCFC02099BB209C891529CF7B90C83D9C63D39D989CBB8ECE6DE2B83B

您不能只是通过等待计时器结束来下载文件,并复制直接链接,它是一个“令牌”链接。它只会在重定向到下载页面之前的一段时间内工作(这就是为什么你要获取HTML而不是二进制数据)。

解决方法

您必须下载multiupload的HTML并从HTML源代码解析直接下载链接。只有这样才能提供获得最新令牌网址的可靠方法。

答案 1 :(得分:0)

@Dark Slipstream如何说,您正在尝试使用过期的令牌网址下载文件 看看如何获​​得新网址:

 System.Net.WebClient client = new System.Net.WebClient();

        // Download URL
        Uri uri = new Uri("http://www.multiupload.com/39QMACX7XS");

        byte[] dbytes = client.DownloadData(uri);
        string responseStr = System.Text.Encoding.ASCII.GetString(dbytes);
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(responseStr);
        string urlToDownload = doc.DocumentNode.SelectNodes("//a[contains(@href,'files/')]")[0].Attributes["href"].Value;
        byte[] data = client.DownloadData(uri);
        length = data.Length; 

我没有解析异常