Tạo web form hiển thị dữ liệu nhập trong TextArea đồng thời kiểm tra kích thước, tên file upload và lưu trong thư mục App_Data.
1. Yêu cầu
Trong VS.Net, tạo Web Site/Web Application project đặt tại D:\Web10. Trong Web Site trên, thực hiện:
- Tạo Web Form Bai10.aspx chứa: 1 HTML TextArea (txtNoidung), 1 HTML Input File (txtFile), 1 HTML Input Submit trong 1 HTML Form gửi đến chính trang Bai10.aspx.
- Lập trình xử lý khi nạp trang Bai10.aspx để nếu có dữ liệu như trong ý (1) gửi đến thì:
- Hiển thị dữ liệu của txtNoidung.
- Lưu file của txtFile vào 1 file có tên tương ứng trong thư mục App_Data của Web Application.
2. Hướng dẫn thực hiện
File home.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="home.aspx.cs" Inherits="w100.home" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Bài 10</title> <style> *{ margin:0; padding:0; } .form{ border: 1px solid #000; width:40%; margin: 0 auto; } .form-row{ padding: 12px 12px; } .form-label{ display:block; } .input-btn{ padding: 4px 8px; background-color: #000; color: #fff; } </style> </head> <body> <form id="form1" runat="server" method="post" action="home.aspx" > <div class="form"> <div class="form-row"> <label class="form-label" for="txtNoidung">Nhập dữ liệu:</label> <textarea id="txtNoidung" name="txtNoidung" runat="server"> </textarea> </div> <div class="form-row"> <label class="form-label" for="txtFile">Nhập file:</label> <input type="file" name="txtFile" id="txtFile" runat="server"/> </div> <div class="form-row"> <input class="input-btn" type="submit" name="luu" id="luu" value="Save" onclick="Upload"/> </div> <div class="form-row"> <div id="ketqua" name="ketqua" runat="server" ></div> </div> </div> </form> </body> </html>
Khi bạn đặt thuộc tính “runat=server” cho một phần tử HTML, nghĩa là bạn muốn phần tử đó được xử lý ở phía máy chủ (server-side) bằng mã code-behind.
Cụ thể, thuộc tính “runat=server” cho phép các phần tử HTML trở thành các điều khiển (controls) ASP.NET, và điều khiển này có thể được truy cập và xử lý từ mã code-behind. Khi trang web được tải lên trên máy chủ, các phần tử được đánh dấu “runat=server” sẽ được biến đổi thành các đối tượng ASP.NET tương ứng.
Ví dụ, trong mã của bạn, <textarea id="txtNoidung" name="txtNoidung" runat="server"></textarea>
có thuộc tính “runat=server”, cho phép bạn truy cập và xử lý nội dung của textarea từ mã code-behind bằng cách sử dụng thuộc tính txtNoidung
.
Phương thức Page_Load
Phương thức Page_Load
là một phương thức sự kiện trong trang web ASP.NET được gọi mỗi khi trang được tải lên hoặc làm mới. Dưới đây là giải thích về logic trong phương thức này:
if (IsPostBack)
- Điều kiện kiểm tra xem trang web có được tải lên sau khi gửi biểu mẫu (PostBack) hay không. Nếu là PostBack, có nghĩa là người dùng đã gửi biểu mẫu bằng cách nhấn nút “Save” hoặc một hành động tương tự.
txtNoidung.InnerHtml = "";
- Gán giá trị rỗng cho nội dung của phần tử
<textarea>
có ID làtxtNoidung
. Điều này sẽ xóa nội dung đã nhập trước đó trong trườngtxtNoidung
của người dùng.
- Gán giá trị rỗng cho nội dung của phần tử
Upload(sender, e);
- Gọi phương thức
Upload
và chuyển các đối sốsender
vàe
tương ứng. Điều này sẽ thực thi logic xử lý trong phương thứcUpload
để xử lý dữ liệu được gửi đi từ biểu mẫu.
- Gọi phương thức
Phương thức Upload
Để kiểm soát file được tải lên và kích thước của file đó, ta sử dụng if((txtFile.PostedFile != null) && (txtFile.PostedFile.ContentLength > maxFileLength))
. Dưới đây là giải thích chi tiết về các phần tử trong biểu thức điều kiện:
txtFile.PostedFile != null
- Kiểm tra xem có file được tải lên thông qua phần tử
<input type="file" name="txtFile" id="txtFile" runat="server"/>
hay không. - Thuộc tính
PostedFile
củatxtFile
là đối tượng chứa thông tin về file được tải lên từ trình duyệt.
- Kiểm tra xem có file được tải lên thông qua phần tử
txtFile.PostedFile.ContentLength > maxFileLength
- Kiểm tra xem kích thước của file được tải lên (
txtFile.PostedFile.ContentLength
) có lớn hơn giới hạnmaxFileLength
hay không. - Thuộc tính
ContentLength
chứa kích thước của file được tải lên (tính bằng byte).
- Kiểm tra xem kích thước của file được tải lên (
Nếu cả hai điều kiện đều đúng, tức là có file được tải lên và kích thước của file đó lớn hơn 0, mã sẽ thực hiện các hành động bên trong khối if
. Dưới đây là các bước thực hiện:
string fn = "App_Data/" + txtFile.PostedFile.FileName;
- Tạo đường dẫn file mới trong thư mục “App_Data” với tên file gốc được lấy từ
txtFile.PostedFile.FileName
.
- Tạo đường dẫn file mới trong thư mục “App_Data” với tên file gốc được lấy từ
string name = fn.ToString();
- Chuyển đường dẫn file thành chuỗi.
int lengthfn = name.Length;
- Lấy độ dài của chuỗi đường dẫn file.
if (lengthfn > 20)
- Kiểm tra xem độ dài của chuỗi đường dẫn file có vượt quá 20 kí tự hay không.
- Nếu vượt quá, hiển thị thông báo lỗi.
else
- Trường hợp không vượt quá 20 kí tự, tiếp tục thực hiện các bước tiếp theo.
string fileName = "App_Data/" + DateTime.Now.ToString("yyyyMMdd_hhmmss_tt_") + txtFile.PostedFile.FileName;
- Tạo tên file mới dựa trên ngày giờ hiện tại và tên file gốc.
string filePath = Server.MapPath(fileName);
- Lấy đường dẫn tuyệt đối của file mới trong thư mục “App_Data” trên máy chủ.
txtFile.PostedFile.SaveAs(filePath);
- Lưu file được tải lên vào đường dẫn tệp được chỉ định.
ketqua.InnerText = "Nội dung: " + noidung;
- Hiển thị thông điệp thành công và nội dung từ trường
txtNoidung
.
- Hiển thị thông điệp thành công và nội dung từ trường
catch (Exception ex)
- Bắt các ngoại lệ nếu có lỗi trong quá trình lưu file.
ketqua.InnerText = "Error:" + ex.Message;
- Hiển thị thông báo lỗi nếu xảy ra ngoại lệ.
File home.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace w100 { public partial class home : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { txtNoidung.InnerHtml = ""; Upload(sender, e); } } protected void Upload(object sender, EventArgs e) { int maxFileLength = 512000; // 500KB = 500 * 1024 string noidung = Request.Form["txtNoidung"]; if (noidung == "") { ketqua.InnerHtml = "<span> Nội dung không được để trống</span>"; }else if((txtFile.PostedFile != null) && (txtFile.PostedFile.ContentLength > maxFileLength)) { ketqua.InnerHtml = "<span>File không được vượt quá 500KB</span>"; } else if ((txtFile.PostedFile != null) && (txtFile.PostedFile.ContentLength > 0)) { string fn = "App_Data/" + txtFile.PostedFile.FileName; string name = fn.ToString(); int lengthfn = name.Length; if (lengthfn > 20) { ketqua.InnerHtml = "<span>Tên File không được vượt quá 20 kí tự</span>"; } else { string fileName = "App_Data/" + DateTime.Now.ToString("yyyyMMdd_hhmmss_tt_") + txtFile.PostedFile.FileName; string filePath = Server.MapPath(fileName); try { txtFile.PostedFile.SaveAs(filePath); ketqua.InnerText = "Nội dung: " + noidung; } catch (Exception ex) { ketqua.InnerText = "Error:" + ex.Message; } } }else { ketqua.InnerHtml = "<span>Bạn chưa chọn File</span>"; } } } }
Trên đây là hướng dẫn cách kiểm tra dung lượng, tên file trong asp.net thuộc chuỗi bài tập thực hành môn lập trình web. Cảm ơn các bạn đã tham khảo trên ttnguyen.net.