Скачать файл с данного URL - PullRequest
1 голос
/ 23 декабря 2011

Может кто-нибудь сказать мне хороший способ получить расширение файла при попытке загрузить файл с данного URI? В настоящее время я использую WebClient для загрузки файла. Я получаю MIME-тип и использую его, я сопоставляю его с расширениями.

Здесь это пользовательский веб-клиент, который в зависимости от свойства HeadOnly либо возвращает данные, либо просто заголовок.

public class SlideWebClient : WebClient {
    public bool HeadOnly { get; set; }
        protected override WebRequest GetWebRequest(Uri address) {
            WebRequest req = base.GetWebRequest(address);
            if (HeadOnly && req.Method == "GET") {
                req.Method = "HEAD";
            }
            return req;
        }
    }
}


public class FileDownloader {           

    /// <summary>
    /// Function to download a file from URL and save it to local drive
    /// </summary>
    /// <param name="_URL">URL address to download file</param>
    public static void DownloadFile(Uri source, string destination) {
        try {
            using (WebClient _WebClient = new WebClient()) {
                // Downloads the resource with the specified URI 
                // to a local file.
                _WebClient.DownloadFile(source, destination);
            }
        } catch (Exception _Exception) {
            // Error
            Console.WriteLine("Exception caught in process: {0}", 
                _Exception.ToString());
        }
    }

    /// <summary>
    ///Get the Content type of file to be downloaded  for given URI
    /// </summary>
    /// <returns></returns>
    public static String GetContentType(Uri url) {
        using (SlideWebClient client = new SlideWebClient()) {
            client.HeadOnly = true;
            // note should be 0-length
            byte[] body = client.DownloadData(url); 
            return client.ResponseHeaders["content-type"];
        }
    }

    public static bool  IsPdf(string contentType) {
        if (contentType.Contains("application/pdf")) return true;
        else return false;
    }
}

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Это должно помочь ... Я использовал его, чтобы загрузить последний файл обновления для клиентов. Все, что вам нужно, это кнопка и индикатор выполнения.

    private void btnStartDownload_Click(object sender, EventArgs e)
    {
        WebClient client = new WebClient();
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
        client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);

        client.DownloadFileAsync(new Uri(@"http://www.trendmicro.com/ftp/products/wfbs/WFBS70_EN_GM_B1343.exe"), @"C:\temp\WFBS7.exe");
        btnStartDownload.Text = "Download In Process";
        btnStartDownload.Enabled = false;
    }

    void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        double bytesIn = double.Parse(e.BytesReceived.ToString());
        double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
        double percentage = bytesIn / totalBytes * 100;
        progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
    }

    void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        MessageBox.Show("Download Completed");
        btnStartDownload.Text = "Start Download";
        btnStartDownload.Enabled = true;
    }
0 голосов
/ 23 декабря 2011

Если вам нужен только тип файла, а не файл, просто посмотрите на последний сегмент URI и проверьте его на наличие известных типов файлов. Это не гарантируется, однако, если вам все равно нужно скачать файл, тогда mime-type - ваш лучший выбор.

...