mvc form desde descargar archivo c# downloadfile

desde - descargar archivo c# windows form



¿Cómo descargar un archivo desde una URL en C#? (11)

El siguiente código contiene la lógica para descargar el archivo con el nombre original

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

¿Cuál es una forma sencilla de descargar un archivo desde una ruta URL?


En lugar de descargarlo en un archivo local, puede convertirlo en un objeto de flujo de bytes y almacenarlo como un BLOB varbinary (MAX) en SQL Server.

Dado que su mesa se ve como:

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();


Es posible que deba conocer el estado y actualizar una Barra de progreso durante la descarga del archivo o usar las credenciales antes de realizar la solicitud.

Aquí está, un ejemplo que cubre estas opciones. Se ha utilizado la notación lambda y la interpolación de cadenas :

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


Incluir este espacio de nombres

using System.Net;

Descargue de forma asíncrona y coloque una barra de progreso para mostrar el estado de la descarga dentro de la interfaz de usuario.

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; }


Intenta usar esto:

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


También puede usar el método DownloadFileAsync en la clase de WebClient. Descarga a un archivo local el recurso con el URI especificado. También este método no bloquea el hilo de llamada.

Muestra:

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

Para más información:

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


Utilice 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()) { myStringWebResource = remoteUri + fileName; // Download the Web resource and save it into the current filesystem folder. myWebClient.DownloadFile(myStringWebResource, fileName); }


Verifique si hay una conexión de red usando GetIsNetworkAvailable() para evitar crear archivos vacíos cuando no esté conectado a una red.

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


Clase completa para descargar un archivo mientras se imprime el estado en la consola.

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

Uso:

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


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


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