Download và xử lý file bằng stream
Posted: 18/6/2009.
Bạn cần lấy một file từ một website, nhưng không muốn lưu trực tiếp vào đĩa. Thay vào đó, bạn muốn xử lý ngay trong ứng dụng của mình. Hãy sử dụng lớp WebRequest để tạo yêu cầu, lớp WebResponse để nhận đáp ứng từ web server, và một số dạng reader ( StreamReader...
Bạn cần lấy một file từ một website, nhưng không muốn lưu trực tiếp vào đĩa. Thay vào đó, bạn muốn xử lý ngay trong ứng dụng của mình. Hãy sử dụng lớp WebRequest để tạo yêu cầu, lớp WebResponse để nhận đáp ứng từ web server, và một số dạng reader (StreamReader đối với dữ liệu HTML hay text, hoặc BinaryReader đối với dữ liệu nhị phân) để phân tích đáp ứng đó.
Download một file cần bốn bước cơ bản sau:
1. Sử dụng phương thức tĩnh Create của lớp System.Net.WebRequest để chỉ định trang bạn cần. Phương thức này trả về một đối tượng dẫn xuất từ WebRequest, phụ thuộc vào kiểu Uniform Resource Identifier (URI) bạn sử dụng. Ví dụ, nếu tài nguyên là HTTP (với cụm từ http://), nó sẽ tạo ra đối tượng HttpWebRequest; nếu tài nguyên là file (với cụm từ file://), nó sẽ tạo ra đối tượng FileWebRequest. Bạn có thể thiết lập thời gian trễ thông qua thuộc tính WebRequest.Timeout.
2. Sử dụng phương thức GetResponse của đối tượng WebRequest, phương thức này trả về một đối tượng WebResponse cho trang. Nếu yêu cầu vượt qua thời gian trễ thì ngoại lệ WebException sẽ bị ném.
3. Tạo một StreamReader hoặc một BinaryReader cho WebResponse.
4. Công việc cuối cùng là xử lý stream này, chẳng hạn ghi nó ra file rồi hiển thị trong ứng dụng của bạn...
Đoạn mã dưới đây sẽ lấy và hiển thị một file ảnh và nội dung HTML của một trang web.
- using System; using System.Net; using System.IO;
- using System.Drawing;
- using System.Windows.Forms;
- public class DownloadForm : System.Windows.Forms.Form {
- private System.Windows.Forms.PictureBox picBox;
- private System.Windows.Forms.TextBox textBox;
-
- private void DownloadForm_Load(object sender, System.EventArgs e) {
- string picUri = "http://localhost/winXP.gif";
- string htmlUri ="http://localhost/iishelp/iis/misc/default.asp";
-
- WebRequest requestPic = WebRequest.Create(picUri);
- WebRequest requestHtml = WebRequest.Create(htmlUri);
-
-
- WebResponse responsePic = requestPic.GetResponse();
- WebResponse responseHtml = requestHtml.GetResponse();
-
- Image downloadedImage =Image.FromStream(responsePic.GetResponseStream());
- StreamReader r =new StreamReader(responseHtml.GetResponseStream());
- string htmlContent = r.ReadToEnd();
- r.Close();
-
- picBox.Image = downloadedImage;
-
- textBox.Text = htmlContent;
- }
- }
Hình minh họa download nội dung của một trang web:
Để download file lớn một cách hiệu quả, bạn nên sử dụng thêm kỹ thuật bất đồng bộ. Bạn cũng có thể sử dụng phương thức WebRequest.BeginGetResponse, phương thức này không chặn mã lệnh của bạn và sẽ gọi thủ tục callback khi nhận được đáp ứng.
[Nghean-Aptech st]
Các tin mới:
Hướng dẫn tích hợp giao diện trang quản trị SB Admin 2 vào Laravel 5.8.
Hướng dẫn tích hợp Google ReCaptcha v2 vào Laravel bằng curl.
Học lập trình React JS trong vòng 5 phút.
Sử dụng trình soạn thảo CKeditor tích hợp CKFinder với Laravel.
Hướng dẫn cài đặt Apache, PHP, MySQL, PHPMyAdmin trên Windows 10 và cấu hình SendMail.
Các tin cũ hơn:
Làm ứng dụng chỉ chạy được một thể hiện.
8 kỹ năng lập trình sẽ “hot” trong 5 năm tới.
VB6: Lập trình tiện ích như "Task Manager".
10 kỹ năng người lập trình cần có.
Sothink Tree Menu 2.6.