PHP
Python

Trang chủ

CGI là gì? Cách thức hoạt động của CGI?

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
02/11/2024
20 phút đọc
Theo dõi Vietnix trên

CGI là gì? Cách thức hoạt động của CGI?

<H1> Python – CGI Programming

Giao diện cổng Chung (CGI) là một tập hợp các tiêu chuẩn định nghĩa cách trao đổi thông tin giữa máy chủ web và một script tùy chỉnh. Các thông số kỹ thuật CGI hiện đang được duy trì bởi NCSA.

image 130
CGI là gì? Cách thức hoạt động của CGI? 33

<H2> What is CGI?

  • Giao diện cổng chung, hay CGI là một tiêu chuẩn để các chương trình cổng bên ngoài giao tiếp với các máy chủ thông tin như các máy chủ HTTP.
  • Phiên bản hiện tại là CGI/1.1 và CGI/1.2 đang trong quá trình phát triển.

<H2> Web Browsing

Để hiểu khái niệm CGI, chúng ta hãy xem điều gì xảy ra khi nhấp vào một liên kết để duyệt một trang web hoặc URL cụ thể.

  • Trình duyệt của bạn liên hệ với máy chủ web HTTP và yêu cầu URL, tức là tên tệp.
  • Máy chủ web phân tích URL và tìm tên tệp. Nếu tìm thấy tệp đó thì gửi lại cho trình duyệt, nếu không sẽ gửi thông báo lỗi cho biết bạn đã yêu cầu sai tệp.
  • Trình duyệt web nhận phản hồi từ máy chủ web và hiển thị tệp nhận được hoặc thông báo lỗi.

Tuy nhiên, có thể cấu hình máy chủ HTTP để khi một tệp trong một thư mục nhất định được yêu cầu, tệp đó không được gửi lại mà thay vào đó nó sẽ được thực thi như một chương trình, và bất cứ gì chương trình đó xuất ra sẽ được gửi lại để trình duyệt của bạn hiển thị. Chức năng này được gọi là Giao diện cổng Chung hoặc CGI và các chương trình này được gọi là script CGI. Các chương trình CGI này có thể là một script Python, script PERL, script Shell, chương trình C hoặc C++, v.v.

<H2> CGI Architecture Diagram

image 518

<H2> Web Server Support and Configuration

Trước khi tiến hành lập trình CGI, hãy đảm bảo rằng máy chủ web của bạn hỗ trợ CGI và được cấu hình để xử lý các chương trình CGI. Tất cả các chương trình CGI được thực thi bởi máy chủ HTTP đều được lưu trữ trong một thư mục được cấu hình trước. Thư mục này được gọi là Thư mục CGI và theo quy ước, nó được đặt tên là /var/www/cgi-bin. Theo quy ước, các tệp CGI có phần mở rộng là .cgi, nhưng bạn cũng có thể đặt tệp của mình với phần mở rộng Python là .py.

Mặc định, máy chủ Linux được cấu hình để chỉ chạy các script trong thư mục cgi-bin trong /var/www. Nếu bạn muốn chỉ định bất kỳ thư mục nào khác để chạy script CGI của mình, hãy thêm chú thích vào các dòng sau trong tệp httpd.conf.

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

Dòng sau đây cũng cần được thêm vào máy chủ Apache để xử lý tệp .py như là script CGI.

AddHandler cgi-script .py

Ở đây, giả sử rằng bạn đã có máy chủ Web hoạt động thành công và bạn có thể chạy bất kỳ chương trình CGI nào khác như Perl hoặc Shell, v.v.

<H2> First CGI Program

Dưới đây là một liên kết đơn giản, liên kết với một script CGI gọi là hello.py. Tệp này được lưu trong thư mục /var/www/cgi-bin và có nội dung sau. Trước khi chạy chương trình CGI của bạn, hãy chắc chắn bạn đã thay đổi chế độ của tệp bằng lệnh UNIX chmod 755 hello.py để làm cho tệp có thể thực thi.

print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! This is my first CGI program</h2>')
print ('</body>')
print ('</html>')

Lưu ý: Dòng đầu tiên trong script phải là đường dẫn đến tệp thực thi Python. Nó xuất hiện dưới dạng một nhận xét trong chương trình Python, nhưng nó được gọi là dòng shebang.

Trên Linux, nó phải là #!/usr/bin/python3.

Trên Windows, nó phải là #!c:/python311/python.exe.

Nhập URL sau vào trình duyệt của bạn:

http://localhost/cgi-bin/hello.py
image 526
CGI là gì? Cách thức hoạt động của CGI? 34

Script hello.py này là một script Python đơn giản, ghi đầu ra của nó lên tệp STDOUT, tức là màn hình. Có một tính năng quan trọng và bổ sung là dòng đầu tiên được in ra là Content-type:text/html\r\n\r\n. Dòng này được gửi lại trình duyệt và nó chỉ định loại nội dung sẽ được hiển thị trên màn hình trình duyệt.

Bây giờ bạn chắc hẳn đã hiểu khái niệm cơ bản về CGI và có thể viết nhiều chương trình CGI phức tạp hơn sử dụng Python. Script này có thể tương tác với bất kỳ hệ thống bên ngoài nào khác để trao đổi thông tin như RDBMS.

<H2> HTTP Header

Dòng Content-type:text/html\r\n\r\n là một phần của tiêu đề HTTP được gửi đến trình duyệt để hiểu nội dung. Tất cả các tiêu đề HTTP sẽ có dạng sau:

HTTP Field Name: Field Content

For Example
Content-type: text/html\r\n\r\n

Có một số tiêu đề HTTP quan trọng khác mà bạn sẽ thường xuyên sử dụng trong lập trình CGI của mình.

SttTiêu đề & Mô tả
1Content-type:
Một chuỗi MIME định nghĩa định dạng của tệp được trả về. Ví dụ: Content-type:text/html.
2Expires: Date
Ngày mà thông tin trở nên không hợp lệ. Nó được trình duyệt sử dụng để quyết định khi nào cần làm mới một trang. Một chuỗi ngày hợp lệ có định dạng 01 Jan 1998 12:00:00 GMT.
3Location: URL
URL được trả về thay vì URL yêu cầu. Bạn có thể sử dụng trường này để chuyển hướng yêu cầu đến bất kỳ tệp nào.
4Last-modified: Date
Ngày sửa đổi cuối cùng của tài nguyên.
5Content-length: N
Chiều dài, tính bằng byte, của dữ liệu được trả về. Trình duyệt sử dụng giá trị này để báo cáo thời gian tải xuống ước tính cho một tệp.
6Set-Cookie: String
Thiết lập cookie được truyền qua chuỗi.

<H2> CGI Environment Variables

Tất cả các chương trình CGI đều có quyền truy cập vào các biến môi trường sau. Những biến này đóng vai trò quan trọng khi viết bất kỳ chương trình CGI nào.

SttTên biến & Mô tả
1CONTENT_TYPE
Loại dữ liệu của nội dung. Được sử dụng khi máy khách gửi nội dung đính kèm đến máy chủ. Ví dụ: tải lên tệp.
2CONTENT_LENGTH
Độ dài của thông tin truy vấn. Nó chỉ có sẵn cho các yêu cầu POST.
3HTTP_COOKIE
Trả về các cookie được đặt dưới dạng cặp khóa và giá trị.
4HTTP_USER_AGENT
Trường yêu cầu User-Agent chứa thông tin về tác nhân người dùng gửi yêu cầu. Nó là tên của trình duyệt web.
5PATH_INFO
Đường dẫn cho script CGI.
6QUERY_STRING
Thông tin mã hóa URL được gửi cùng với yêu cầu GET.
7REMOTE_ADDR
Địa chỉ IP của máy chủ từ xa thực hiện yêu cầu. Điều này hữu ích cho việc ghi nhật ký hoặc xác thực.
8REMOTE_HOST
Tên đầy đủ của máy chủ thực hiện yêu cầu. Nếu thông tin này không có sẵn, thì có thể sử dụng REMOTE_ADDR để lấy địa chỉ IP.
9REQUEST_METHOD
Phương thức được sử dụng để thực hiện yêu cầu. Các phương thức phổ biến nhất là GET và POST.
10SCRIPT_FILENAME
Đường dẫn đầy đủ đến script CGI.
11SCRIPT_NAME
Tên của script CGI.
12SERVER_NAME
Tên máy chủ hoặc địa chỉ IP của máy chủ.
13SERVER_SOFTWARE
Tên và phiên bản của phần mềm mà máy chủ đang chạy.

Đây là một chương trình CGI nhỏ để liệt kê tất cả các biến CGI.

import os

print ("Content-type: text/html\r\n\r\n");
print ("<font size=+1>Environment</font><\br>");
for param in os.environ.keys():
   print ("<b>%20s</b>: %s<\br>" % (param, os.environ[param]))

<H2> GET and POST Methods

Bạn hẳn đã gặp nhiều tình huống khi cần truyền một số thông tin từ trình duyệt của mình đến máy chủ web và cuối cùng là đến chương trình CGI của bạn. Thường xuyên nhất, trình duyệt sử dụng hai phương pháp để truyền thông tin này đến máy chủ web. Các phương pháp này là Phương pháp GET và Phương pháp POST.

<H2> Passing Information using GET method

Phương pháp GET gửi thông tin người dùng đã được mã hóa và được thêm vào yêu cầu trang. Trang và thông tin mã hóa được phân tách bởi ký tự ? như sau:

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2

  • Phương pháp GET là phương pháp mặc định để truyền thông tin từ trình duyệt đến máy chủ web và nó tạo ra một chuỗi dài xuất hiện trong hộp Vị trí của trình duyệt của bạn.
  • Không bao giờ sử dụng Phương pháp GET nếu bạn có mật khẩu hoặc thông tin nhạy cảm khác để truyền đến máy chủ.
  • Phương pháp GET có giới hạn kích thước: chỉ 1024 ký tự có thể được gửi trong một chuỗi yêu cầu.
  • Phương pháp GET gửi thông tin sử dụng tiêu đề QUERY_STRING và sẽ có thể truy cập trong chương trình CGI của bạn thông qua biến môi trường QUERY_STRING.

Bạn có thể truyền thông tin bằng cách đơn giản ghép cặp khóa và giá trị cùng với bất kỳ URL nào hoặc bạn có thể sử dụng các thẻ HTML <FORM> để truyền thông tin bằng Phương pháp GET.

<H2> Simple URL Example:Get Method

Dưới đây là một URL đơn giản, truyền hai giá trị đến chương trình hello_get.py bằng phương pháp GET.

/cgi-bin/hello_get.py?first_name=Malhar&last_name=Lathkar

Dưới đây là script hello_get.py để xử lý đầu vào do trình duyệt web cung cấp. Chúng tôi sẽ sử dụng module cgi, làm cho việc truy cập thông tin truyền vào rất dễ dàng:

# Import modules for CGI handling
import cgi, cgitb

# Create instance of FieldStorage
form = cgi.FieldStorage()

# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')

print ("Content-type:text/html")
print()
print ("<html>")
print ('<head>')
print ("<title>Hello - Second CGI Program</title>")
print ('</head>')
print ('<body>')
print ("<h2>Hello %s %s</h2>" % (first_name, last_name))
print ('</body>')
print ('</html>')

Điều này sẽ tạo ra kết quả sau:

image 527
CGI là gì? Cách thức hoạt động của CGI? 35

<H2> Simple FORM Example:GET Method

Ví dụ này truyền hai giá trị bằng cách sử dụng HTML FORM và nút submit. Chúng tôi sử dụng cùng script CGI hello_get.py để xử lý đầu vào này.

<form action = "/cgi-bin/hello_get.py" method = "get">
   First Name: <input type = "text" name = "first_name">  <br />

   Last Name: <input type = "text" name = "last_name" />
   <input type = "submit" value = "Submit" />
</form>

Dưới đây là kết quả thực tế của form trên, bạn nhập tên đầu tiên và họ và sau đó nhấp vào nút submit để xem kết quả.

image 530
CGI là gì? Cách thức hoạt động của CGI? 36

<H2> Passing Information Using POST Method

Phương pháp POST là phương pháp đáng tin cậy hơn để truyền thông tin đến chương trình CGI. Phương pháp này đóng gói thông tin theo cách giống như phương pháp GET, nhưng thay vì gửi nó dưới dạng chuỗi văn bản sau ? trong URL, nó gửi nó dưới dạng một thông báo riêng biệt. Thông báo này được đưa vào script CGI dưới dạng đầu vào tiêu chuẩn.

Dưới đây là cùng script hello_get.py xử lý cả phương pháp GET và POST.

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"

Hãy lấy lại cùng một ví dụ như trên, truyền hai giá trị bằng cách sử dụng HTML FORM và nút submit. Chúng tôi sử dụng cùng script CGI hello_get.py để xử lý đầu vào này.

<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />

<input type = "submit" value = "Submit" />
</form>

Dưới đây là kết quả thực tế của form trên. Bạn nhập tên đầu tiên và họ, sau đó nhấp vào nút submit để xem kết quả.

image 531
CGI là gì? Cách thức hoạt động của CGI? 37

<H2> Passing Checkbox Data to CGI Program

Hộp kiểm (Checkboxes) được sử dụng khi cần chọn nhiều hơn một tùy chọn.

Dưới đây là mã HTML ví dụ cho một form với hai checkboxes:

<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
   <input type = "checkbox" name = "maths" value = "on" /> Maths
   <input type = "checkbox" name = "physics" value = "on" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Kết quả của mã này là form sau:

image 532
CGI là gì? Cách thức hoạt động của CGI? 38

Dưới đây là script checkbox.cgi để xử lý đầu vào do trình duyệt web cung cấp cho nút checkbox.

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('maths'):
   math_flag = "ON"
else:
   math_flag = "OFF"

if form.getvalue('physics'):
   physics_flag = "ON"
else:
   physics_flag = "OFF"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"

<H2> Passing Radio Button Data to CGI Program

Radio Buttons được sử dụng khi chỉ cần chọn một tùy chọn.

Dưới đây là mã HTML ví dụ cho một form với hai nút radio:

<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
   <input type = "radio" name = "subject" value = "maths" /> Maths
   <input type = "radio" name = "subject" value = "physics" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Kết quả của mã này là form sau:

image 533
CGI là gì? Cách thức hoạt động của CGI? 39

Dưới đây là script radiobutton.py để xử lý đầu vào do trình duyệt web cung cấp cho nút radio:

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('subject'):
   subject = form.getvalue('subject')
else:
   subject = "Not set"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"

<H2> Passing Text Area Data to CGI Program

Phần tử TEXTAREA được sử dụng khi văn bản nhiều dòng cần được truyền đến chương trình CGI.

Dưới đây là mã HTML ví dụ cho một form với hộp TEXTAREA:

<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
   <textarea name = "textcontent" cols = "40" rows = "4">
      Type your text here...
   </textarea>
   <input type = "submit" value = "Submit" />
</form>

Kết quả của mã này là form sau:

image 534
CGI là gì? Cách thức hoạt động của CGI? 40

Dưới đây là script textarea.cgi để xử lý đầu vào do trình duyệt web cung cấp:

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('textcontent'):
   text_content = form.getvalue('textcontent')
else:
   text_content = "Not entered"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"

<H2> Passing Drop Down Box Data to CGI Program

Hộp thả xuống (Drop Down Box) được sử dụng khi có nhiều tùy chọn có sẵn nhưng chỉ một hoặc hai sẽ được chọn.

Dưới đây là mã HTML ví dụ cho một form với một hộp thả xuống:

<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
   <select name = "dropdown">
      <option value = "Maths" selected>Maths</option>
      <option value = "Physics">Physics</option>
   </select>
   <input type = "submit" value = "Submit"/>
</form>

Kết quả của mã này là form sau:

image 535
CGI là gì? Cách thức hoạt động của CGI? 41

Dưới đây là script dropdown.py để xử lý đầu vào được cung cấp bởi trình duyệt web:

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('dropdown'):
   subject = form.getvalue('dropdown')
else:
   subject = "Not entered"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"

<H2> Using Cookies in CGI

Giao thức HTTP là một giao thức không trạng thái. Đối với một trang web thương mại, cần duy trì thông tin phiên giữa các trang khác nhau. Ví dụ, quá trình đăng ký của một người dùng chỉ kết thúc sau khi hoàn thành nhiều trang. Làm thế nào để duy trì thông tin phiên của người dùng trên tất cả các trang web?

Trong nhiều tình huống, sử dụng cookie là phương pháp hiệu quả nhất để ghi nhớ và theo dõi sở thích, mua hàng, hoa hồng và các thông tin khác cần thiết cho trải nghiệm người dùng tốt hơn hoặc thống kê trang web.

<H2> How It Works?

Máy chủ của bạn gửi một số dữ liệu đến trình duyệt của người truy cập dưới dạng cookie. Trình duyệt có thể chấp nhận cookie. Nếu có, nó sẽ được lưu trữ dưới dạng một bản ghi văn bản thuần túy trên ổ cứng của người truy cập. Bây giờ, khi người truy cập truy cập vào một trang khác trên trang web của bạn, cookie sẽ sẵn sàng để truy xuất. Khi được truy xuất, máy chủ của bạn biết/nhớ những gì đã được lưu trữ.

Cookie là một bản ghi dữ liệu văn bản thuần túy với 5 trường có độ dài biến đổi:

  • Expires − Ngày cookie sẽ hết hạn. Nếu trường này để trống, cookie sẽ hết hạn khi người truy cập thoát khỏi trình duyệt.
  • Domain − Tên miền của trang web của bạn.
  • Path − Đường dẫn đến thư mục hoặc trang web đã đặt cookie. Điều này có thể để trống nếu bạn muốn truy xuất cookie từ bất kỳ thư mục hoặc trang nào.
  • Secure − Nếu trường này chứa từ “secure”, thì cookie chỉ có thể được truy xuất với máy chủ bảo mật. Nếu trường này để trống, thì không có hạn chế nào như vậy.
  • Name = Value − Cookie được đặt và truy xuất dưới dạng các cặp khóa và giá trị.

<H2> Setting up Cookies

Rất dễ dàng để gửi cookie đến trình duyệt. Những cookie này được gửi cùng với HTTP Header trước trường Content-type. Giả sử bạn muốn đặt UserIDPassword dưới dạng cookie. Việc thiết lập cookie được thực hiện như sau:

print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT;\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....

Từ ví dụ này, bạn hẳn đã hiểu cách thiết lập cookie. Chúng ta sử dụng header HTTP Set-Cookie để thiết lập cookie.

Việc thiết lập các thuộc tính của cookie như Expires, Domain, và Path là tùy chọn. Lưu ý rằng cookie được thiết lập trước khi gửi dòng kỳ diệu “Content-type/html\r\n\r\n”.

<H2> Retrieving Cookies

Rất dễ dàng để truy xuất tất cả các cookie đã được thiết lập. Cookie được lưu trữ trong biến môi trường CGI HTTP_COOKIE và chúng sẽ có dạng sau:

key1 = value1;key2 = value2;key3 = value3….

Dưới đây là một ví dụ về cách truy xuất cookie:

# Import modules for CGI handling 
from os import environ
import cgi, cgitb

if environ.has_key('HTTP_COOKIE'):
   for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
      (key, value ) = split(cookie, '=');
      if key == "UserID":
         user_id = value

      if key == "Password":
         password = value

print "User ID  = %s" % user_id
print "Password = %s" % password

Điều này tạo ra kết quả sau cho các cookie được thiết lập bởi script trên:

User ID = XYZ
Password = XYZ123

<H2> File Upload Example

Để tải lên một tệp, form HTML phải có thuộc tính enctype được đặt thành multipart/form-data. Thẻ input với loại file tạo ra một nút “Browse”.

<html>
   <body>
      <form enctype = "multipart/form-data" action = "save_file.py" method = "post">
      <p>File: <input type = "file" name = "filename" /></p>
      <p><input type = "submit" value = "Upload" /></p>
      </form>
   </body>
</html>

Kết quả của mã này là form sau:

image 536
CGI là gì? Cách thức hoạt động của CGI? 42

Ví dụ trên đã bị vô hiệu hóa có chủ ý để ngăn mọi người tải lên tệp trên máy chủ của chúng tôi, nhưng bạn có thể thử mã trên với máy chủ của mình.

Dưới đây là script save_file.py để xử lý việc tải lên tệp:

import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# Get filename here.
fileitem = form['filename']

# Test if the file was uploaded
if fileitem.filename:
   # strip leading path from file name to avoid 
   # directory traversal attacks
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = 'The file "' + fn + '" was uploaded successfully'
   
else:
   message = 'No file was uploaded'
   
print """\
Content-Type: text/html\n
<html>
   <body>
      <p>%s</p>
   </body>
</html>
""" % (message,)

Nếu bạn chạy script trên Unix/Linux, bạn cần chú ý thay thế dấu phân cách tệp như sau, nếu không trên máy Windows của bạn, lệnh open() trên sẽ hoạt động tốt.

fn = os.path.basename(fileitem.filename.replace(“\\”, “/” ))

<H2> How To Raise a “File Download” Dialog Box?

Đôi khi, bạn muốn cung cấp tùy chọn nơi người dùng có thể nhấp vào một liên kết và nó sẽ bật lên một hộp thoại “File Download” cho người dùng thay vì hiển thị nội dung thực tế. Điều này rất dễ dàng và có thể đạt được thông qua HTTP header. Header HTTP này khác với header được đề cập trong phần trước.

Ví dụ, nếu bạn muốn làm cho tệp FileName có thể tải xuống từ một liên kết đã cho, thì cú pháp của nó như sau:

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go here.
fo = open("foo.txt", "rb")

str = fo.read();
print str

# Close opend file
fo.close()

Phúc Trần

tại
Vietnix

Kết nối với mình qua

Icon Quote
Icon Quote

Học lập trình online cùng vietnix

Học lập trình online cùng Vietnix

PHPXem thêmThu gọn