WebClient.DownloadFile vs. WebClient.DownloadData - PullRequest
1 голос
/ 10 июля 2011

Я использую 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

Имейте в виду, что я пытаюсь загрузить данные исполняемого файла в байтовый массив.

Спасибо за любую помощь, Evan

Ответы [ 2 ]

2 голосов
/ 10 июля 2011

Вы пытаетесь загрузить файл, используя просроченный URL-адрес токена.См. Ниже:

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

Сервер: www35

Токен: 4D7B4D2BFC3F1A9F765A433BA32ED2C5883D0CE133154A0FDB7E7786547A3165DA62393141C4AF8FF36C75222566CF3EB64AF6FBCFC02099BB209C891529CF7B90C83D9C63D39D989CBB8ECE6DE2B83B

Вы не можете просто загрузить файлдождавшись окончания таймера и скопировав прямую ссылку, это ссылка «токена».Он будет работать только в течение определенного периода времени, прежде чем перенаправить вас обратно на страницу загрузки (именно поэтому вы получаете HTML вместо двоичных данных).

Обходной путь

Вам нужно будет загрузить HTML мультизагрузки и проанализировать прямую ссылку на скачивание из исходного кода HTML.Только этот способ обеспечивает надежный способ получения актуального URL токена.

0 голосов
/ 10 июля 2011

Как сказал @Dark Slipstream, вы пытаетесь загрузить файл, используя просроченный URL-адрес токена посмотрите, как получить новый URL:

 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; 

Я не разбираю исключения

...