如何在C#中的URL下载文件?如何在C#中的URL下载文件?(How to download a f

2019-05-10 12:53发布

什么是从URL路径下载文件的简单方法?

Answer 1:

using (var client = new WebClient())
{
    client.DownloadFile("http://example.com/file/song/a.mpeg", "a.mpeg");
}


Answer 2:

包括这个命名空间

using System.Net;

异步下载并把一个进度条 ,显示的UI线程本身内的下载状态

private void BtnDownload_Click(object sender, RoutedEventArgs e)
{
    using (WebClient wc = new WebClient())
    {
        wc.DownloadProgressChanged += wc_DownloadProgressChanged;
        wc.DownloadFileAsync (
            // Param1 = Link of file
            new System.Uri("http://www.sayka.com/downloads/front_view.jpg"),
            // Param2 = Path to save
            "D:\\Images\\front_view.jpg"
        );
    }
}
// Event to track the progress
void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
}


Answer 3:

使用System.Net.WebClient.DownloadFile

string remoteUri = "http://www.contoso.com/library/homepage/images/";
string fileName = "ms-banner.gif", myStringWebResource = null;

// Create a new WebClient instance.
using (WebClient myWebClient = new WebClient())
{
    string myStringWebResource = remoteUri + fileName;
    // Download the Web resource and save it into the current filesystem folder.
    myWebClient.DownloadFile(myStringWebResource, fileName);        
}


Answer 4:

using System.Net;

WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");


Answer 5:

完整的类来在打印状态控制台下载文件。

using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Threading;

class FileDownloader
{
    private readonly string _url;
    private readonly string _fullPathWhereToSave;
    private bool _result = false;
    private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(0);

    public FileDownloader(string url, string fullPathWhereToSave)
    {
        if (string.IsNullOrEmpty(url)) throw new ArgumentNullException("url");
        if (string.IsNullOrEmpty(fullPathWhereToSave)) throw new ArgumentNullException("fullPathWhereToSave");

        this._url = url;
        this._fullPathWhereToSave = fullPathWhereToSave;
    }

    public bool StartDownload(int timeout)
    {
        try
        {
            System.IO.Directory.CreateDirectory(Path.GetDirectoryName(_fullPathWhereToSave));

            if (File.Exists(_fullPathWhereToSave))
            {
                File.Delete(_fullPathWhereToSave);
            }
            using (WebClient client = new WebClient())
            {
                var ur = new Uri(_url);
                // client.Credentials = new NetworkCredential("username", "password");
                client.DownloadProgressChanged += WebClientDownloadProgressChanged;
                client.DownloadFileCompleted += WebClientDownloadCompleted;
                Console.WriteLine(@"Downloading file:");
                client.DownloadFileAsync(ur, _fullPathWhereToSave);
                _semaphore.Wait(timeout);
                return _result && File.Exists(_fullPathWhereToSave);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Was not able to download file!");
            Console.Write(e);
            return false;
        }
        finally
        {
            this._semaphore.Dispose();
        }
    }

    private void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.Write("\r     -->    {0}%.", e.ProgressPercentage);
    }

    private void WebClientDownloadCompleted(object sender, AsyncCompletedEventArgs args)
    {
        _result = !args.Cancelled;
        if (!_result)
        {
            Console.Write(args.Error.ToString());
        }
        Console.WriteLine(Environment.NewLine + "Download finished!");
        _semaphore.Release();
    }

    public static bool DownloadFile(string url, string fullPathWhereToSave, int timeoutInMilliSec)
    {
        return new FileDownloader(url, fullPathWhereToSave).StartDownload(timeoutInMilliSec);
    }
}

用法:

static void Main(string[] args)
{
    var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec);
    Console.WriteLine("Done  - success: " + success);
    Console.ReadLine();
}


Answer 6:

您也可以在WebClient类使用DownloadFileAsync方法。 它下载到本地文件与指定的URI的资源。 另外这个方法不会阻止调用线程。

样品:

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

欲获得更多信息:

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



Answer 7:

尝试使用这样的:

private void downloadFile(string url)
{
     string file = System.IO.Path.GetFileName(url);
     WebClient cln = new WebClient();
     cln.DownloadFile(url, file);
}


Answer 8:

检查通过网络连接GetIsNetworkAvailable()以避免产生空文件时没有连接到网络。

if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
    using (System.Net.WebClient client = new System.Net.WebClient())
    {                        
          client.DownloadFileAsync(new Uri("http://www.examplesite.com/test.txt"),
          "D:\\test.txt");
    }                  
}


Answer 9:

下面的代码包含的逻辑与原来的名称下载文件

private string DownloadFile(string url)
    {

        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        string filename = "";
        string destinationpath = Environment;
        if (!Directory.Exists(destinationpath))
        {
            Directory.CreateDirectory(destinationpath);
        }
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result)
        {
            string path = response.Headers["Content-Disposition"];
            if (string.IsNullOrWhiteSpace(path))
            {
                var uri = new Uri(url);
                filename = Path.GetFileName(uri.LocalPath);
            }
            else
            {
                ContentDisposition contentDisposition = new ContentDisposition(path);
                filename = contentDisposition.FileName;

            }

            var responseStream = response.GetResponseStream();
            using (var fileStream = File.Create(System.IO.Path.Combine(destinationpath, filename)))
            {
                responseStream.CopyTo(fileStream);
            }
        }

        return Path.Combine(destinationpath, filename);
    }


Answer 10:

您可能需要知道的状态和文件下载时更新进度或提出请求之前使用的凭据。

这是,覆盖这些选项的例子。 LAMBDA符号字符串插值已被使用:

using System.Net;
// ...

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

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

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

    client.DownloadFileAsync(ur, @"C:\path\newImage.jpg");
}


Answer 11:

相反,这个下载到本地文件,你可以转换为字节流对象和存储在SQL Server中的VARBINARY(MAX)BLOB。

鉴于你的表如下所示:

CREATE TABLE [dbo].[Documents](
    [DocumentId] [int] IDENTITY(1,1) NOT NULL,
    [DocumentTypeId] [int] NOT NULL,
    [UploadedByMemberId] [int] NOT NULL,
    [DocumentTitle] [nvarchar](200) NOT NULL,
    [DocumentDescription] [nvarchar](2000) NULL,
    [FileName] [nvarchar](200) NOT NULL,
    [DateUploaded] [datetime] NOT NULL,
    [ApprovedForUsers] [bit] NOT NULL,
    [ApprovedByMemberId] [int] NOT NULL,
    [ApprovedDate] [datetime] NULL,
    [DocBLOB] [varbinary](max) NOT NULL,
 CONSTRAINT [PK_Documents] PRIMARY KEY CLUSTERED 
(
    [DocumentId] ASC
)

            SqlParameter Title = new SqlParameter("@Title", SqlDbType.VarChar);
            SqlParameter FileName = new SqlParameter("@FileName", SqlDbType.VarChar);
            SqlParameter DateFileUploaded = new SqlParameter("@DateUploaded", SqlDbType.VarChar);
            SqlParameter DocBLOB = new SqlParameter("@DocBLOB", SqlDbType.VarBinary);
            command.Parameters.Add(Title);
            command.Parameters.Add(FileName);
            command.Parameters.Add(DateFileUploaded);
            command.Parameters.Add(DocBLOB);
                        myStringWebResource = remoteUri + dataReader["FileName"].ToString();
                        imgdownload = myWebClient.DownloadData(myStringWebResource);
                        querySQL = @"INSERT INTO Documents(DocumentTypeId, UploadedByMemberId, DocumentTitle, DocumentDescription, FileName, DateUploaded, ApprovedForUsers, ApprovedByMemberId, ApprovedDate, DocBLOB) VALUES(1, 0, @Title, '', @FileName, @DateUploaded, 1, 0, GETDATE(), @DocBLOB);";

                        Title.Value = dataReader["Title"].ToString().Replace("'", "''").Replace("\"", "");
                        FileName.Value = dataReader["FileName"].ToString().Replace("'", "''").Replace("\"", "");
                        DateFileUploaded.Value = dataReader["DateUploaded"].ToString();
                        DocBLOB.Value = imgdownload;

                        command.CommandText = querySQL;
                        command.ExecuteNonQuery();


文章来源: How to download a file from a URL in C#?