Nội dung trình bày Tìm hiểu kỹ thuật upload file trong PHP và webserver Apache. Tìm hiểu phương pháp giải quyết việc tên file trùng nhau. Tìm hiểu các hàm quản lý file và thư mục trên server. Tìm hiểu các hàm nén file
Trang 1Nguyễn Hữu Đại - 06HC026
La Tấn Đức - 06HC032 Nguyễn Ái Quang Huy - 06HC065 Phạm Hồng Nhật - 06HC122 Nguyễn Quang Tâm - 06HC150
Trang 3Phần bài tập
Tìm hiểu trang web Image Gallery Trình
bày cách tổ chức file và cách cài đặt của
trang web
Xây dựng trang web quản lý file: cho phép upload, edit, copy, move, delete file hay folder trên server
Trang 4Nội dung:
- Kỷ thuật upload file trong PHP webServer Apache
Trang 5 Các nhà phát triển web cho phép users có thể upload file của họ để chia sẻ cho bạn
Trang 6move_uploaded_file ($_FILE['file_uploa d']['tmp_name'],"destination")
Giá trị trả về : TRUE nếu thành công
Giá trị trả về : FALSE nếu thất bại
Trang 7 Sử dựng biến toàn cục $_FILE để xác
định các thuộc tính của file
$_FILE['file_upload']['name'] : Tên file
(file_upload) upload lên server
- $_FILE['file_upload']['size'] : Kích thước của file
- $_FILE['file_upload']['type'] : Kiểu file
Trang 8 - $_FILE['file_upload']['tmp_name'] : Tên thư mục tạm trên server để chứa file
- $_FILE['file_upload']['error'] : Thông báo lỗi khi upload file
Trang 9Constant Name Valu
UPLOAD_ERR_OK 0 Thành công
UPLOAD_ERR_INI_SIZE 1 Kích thước file vượt quá mức được cấu
hình trong file php.ini
UPLOAD_ERR_FORM_S
IZE
2 Kích thước file vượt quá Max_Size được
thiết lập trong hidden fiel
UPLOAD_ERR_PARTIA
L
UPLOAD_ERR_NO_FILE 4 Không thành công
Trang 16Nội dung:
CÁC HÀM QUẢN LÝ FILE & THƯ
MỤC TRÊN SERVER
Trang 171. chdir
bool chdir(string dir) : chuyển đổi thư mục
làm việc hiện hành sang thư mục dir
Return:
▪ Flase : nếu không thể chuyển đổi thư mục hiện hành.
▪ True : mọi trường hợp còn lại.
▪ Trường hợp chdir() flase, một cảnh báo được sinh ra Để
Trang 192. Closedir
void closedir(resource_pointer dir_stream) :
được dùng để hủy luồng(thư mục) đã được
mở trước đó bằng hàm opendir()
Hầu như không cần thiết dùng hàm closedir()
Trang 203 Dir
mixed dir(string dir) :khi gọi hàm nó mở một luồng
tới thư mục dir và trả về một đối tượng và đồng thời tạo ra một con trỏ cho luồng này.
$object_name = dir ('directory_path');
Đối tượng trả về chứa 3 phương thức:
Trang 21 Ex: liệt kê mọi thư mục trong thư mục hiện hành.
$directory = getcwd ();
$dir_object = @ dir ($directory) or die ("Could not
open a directory stream for <i>$directory</i>"); print_r ($dir_object);
Trang 224. readdir
string readdir(resource_pointer
dir_stream) : đọc ra các muc từ luồng thư mục được mở
Trang 23 Ex:
$directory = getcwd ();
$directory_stream = @ opendir ($directory) or die ("Could not open a directory stream for <i>$directory</i>"); while ($entry = readdir ($directory_stream))
Trang 25 Những hàm thông dụng:
chgrp; chmod; chown; clearstatcache;
copy; diskfreespace; fclose; feof; fgetc; fgetcsv; fgets; fgetss; file; fileatime;
filegroup; fileinode ; filemtime; fileowner; fileperms; filesize; filetype; file_exists;
flock; fopen; fpassthru; fputs; fread;
Trang 26 bool chmod(string file, int mode) :Thay đổi quyền truy cập trên file.
Ex : thay đổi quyền truy cập file tới rw-r r "
"-$file = "test_file";
Trang 27 bool chown(string file, mixed user) : thay đổi quyền sở hữu của file.
Ex: Thay quyền sở hữu là “user”
$file = "test_file";
if (! chown ($file, "user"))
Trang 28 bool copy(string from, string to) :sao chép file
Ex:Tạo bản copy sao lưu của một file
$file = "file";
$file_new = $file ".backup";
Trang 29 bool fclose(resource file_handle) : đóng file
Ex : mở và đóng một file
$fh = fopen ("test.txt", "r");
fclose ($fh);
Trang 30 bool feof(resource file_handle): kiểm tra đã duyệt đến cuối file chưa
Ex: Đọc một file cho đến hết
$fh = fopen ("test.txt", "r");
while(! feof ($fh))
{ $output = htmlspecialchars(fgets($fh,
Trang 31 string fgetc(resource file_handle) :đọc một ký tự từ file
Ex: Đọc từng ký tự trong file
$fh = fopen("test.txt", "r");
while (! feof ($fh))
Trang 32 string fgets(resource file_handle, int
Trang 33 string fgetss(resource file_handle, int
bytes) : Đọc một dòng từ file loại bỏ mọi thẻ HTML và thẻ PHP
Ex
$fh = fopen("test.txt", "r");
while(!feof($fh))
{ $output = fgetss($fh, 1024);
Trang 34 array file(string filename) : Đọc một file trong mảng
Ex
$file_array = file("test.txt");
for($i = 0; $i < count($file_array); $i++) { echo ("\$file_array[$i] equals
Trang 35 int fileatime(string filename) :lấy thời gian truy cập cuối của file
Ex
$filetime = fileatime("myfile");
echo (date("d M Y", $filetime));
Trang 36 int filectime(string filename) : lấy thời gian mà file được thay đổi lần cuối
Ex
$filetime = filectime("myfile");
echo (date("d M Y", $filetime));
Trang 37 int filegroup(string filename) :Lấy ID nhóm file
Ex
$filegroup = filegroup("myfile");
echo ($filegroup);
Trang 38 int fileowner(string filename) :lấy ID chủ sở hữu file
Ex:
$fileowner = fileowner("myfile");
echo ($fileowner);
Trang 39 int fileperms(string filename) :lấy quyền truy cập file.
Ex:
$fileperms = fileperms("myfile"); echo ($fileperms);
Trang 40 int filesize(string filename) :lấy kích thước file
Ex:
$filesize = filesize("myfile");
echo ($filesize);
Trang 41 string filetype(string filename) :lấy kiểu file
Ex:
$filetype = filetype("myfile");
echo ($filetype);
Trang 42 bool file_exists(string filename) :Xác định sự tồn tại file.
Ex:
if(!file_exists("myfile"))
{ echo ("File not found"); }
Trang 43 bool flock(resource file_handle, int operation)
Thực hiện khóa hay giải phóng file
Operation:
1: giành khóa đọc (reader)
2: giành khóa ghi độc quyền (writer)
Trang 45 bool fputs(resource file_handle, string data, [int bytes]) : Ghi ra file
Ex:
$string = "Hello World!\n";
$file = "test.txt"; $fh = fopen($file,"w");fputs($fh, $string);
Trang 46 string fread(resource file_handle, int bytes) Đọc từ file
Trang 47 int fseek(resource file_handle, int offset) Di chuyển trong file
Ex : in ra các ki tự xen kẽ trong file
$fh = fopen("test.txt", "r");
$a = 0;
while(!feof($fh))
{ fseek($fh, $a);
Trang 48 bool is_file(string filename): kiểm tra
có đúng là file hay không
Trang 49 bool is_readable(string filename) :kiểm tra file có thể đọc không
Trang 50 bool is_writeable(string filename) :Kiểm tra file có cho phép ghi không
Trang 52 RAR thì thông dụng và hiệu quả
trong lưu trữ tài liệu, được tạo bởi Eugene Roshal
Chỉ hỗ trợ việc đọc file RAR, không
hỗ trợ việc ghi file RAR
Cài đặt:
Trang 54 bool rar_close ( resource $rar_file ):
Đóng file RAR và giải phóng tài
nguyên
RarEntry rar_entry_get ( resource
$rar_file , string $entry_name ) : lấy các mục lưu trữ từ file RAR
Trang 55 bool Rar:: extract ( string $dir [,
string $filepath ] ): giải nén dữ liệu mục lưu trữ đến thư mục
Trang 56 int Rar:: getAttr ( void ): trả vể
thuộc tính của mục lưu trữ
int Rar:: getCrc ( void ): trả về CRC
của mục lưu trữ
string Rar:: getFileTime ( void ): lấy
Trang 57 int Rar:: getHostOs ( void ): trả về code
của Host của mục lưu trữ
Trang 58 string Rar:: getName ( void ): trả về
tên của mục lưu trữ
Trang 59 int Rar:: getPackedSize ( void ): lấy
kích thước gói của mục lưu trữ
Trang 60 int Rar::getUnpackedSize ( void ):
lấy kích thước thực của gói của mục lưu trữ
Trang 61 int Rar::getVersion ( void ): lấy
Version
Trang 62 array rar_list ( resource $rar_file ):
lấy danh sách các entry
Trang 63 Mục đích : Đọc / Ghi file ZIP
Cài đặt – cấu hình : Để làm việc với
các tập tin Zip trên máy chủ, ta phải cài đặt thêm các thư viện sau :
Các Zip PELC mở rộng :
Các hàm nén file thì mặc định không được kích
Trang 64 mixed zip_open ( string $filename ): Mở 1
file zip để đọc.
mixed zip_read ( resource $zip ): Đọc 1 mục
nhập kế tiếp trong file zip.
void zip_close ( resource $zip ) : Đóng 1 file
Zip.
<?php
$zip = zip_open("test.zip");
Trang 65 bool zip_entry_close ( resource
$zip_entry ): Đóng 1 mục nhập trong file zip.
( resource $zip_entry ): Trả về kích thước nén của 1 mục nhập trong file zip.
Trang 66 int zip_entry_filesize ( resource $zip_entry ):
Trả về kích thước thực tế của file của 1 mục
nhập trong file zip.
string zip_entry_name ( resource $zip_entry ):
Trả về tên của 1 mục nhập trong file zip.
bool zip_entry_open ( resource $zip ,
resource $zip_entry [, string $mode ] ): Mở 1
mục nhập trong file zip để đọc.
Trang 67 bool ZipArchive::addEmptyDir ( string
$dirname ): thêm thư mục trống trong thư mục nén.
Trang 68 bool ZipArchive::addFile ( string
$filename [, string $localname ] ): thêm file vào thư mục nén
Trang 69 bool ZipArchive::addFromString ( string
$localname , string $contents ): Thêm một file đến thư mục zip sử dụng nội dung của nó
VD 1: Add an entry to a new archive
Trang 70VD 2: Add file to a directory inside an archive
Trang 71 bool ZipArchive::close ( void ):
Đóng một thư mục nén đã mở hoặc tạo và lưu sự thay đổi Phương thức này tự động gọi khi kết thúc script
Trang 72 bool ZipArchive::deleteIndex ( int
$index ): Xóa một entry trong thư
mục nén sử dụng chỉ số của nó
Trang 73 bool ZipArchive::deleteName
(string $name): Xóa một entry trong thư mục nén sử dụng tên của nó
Trang 74 resource ZipArchive::extractTo
(string $destination [,resource
$entries ]): Giải nén toàn bộ thư mục nén hoặc đưa file đến đích xác định
$destination: Vị trí chứa file giải nén
$entries: Những entry được giải nén, bao gồm tên của entry hoặc mảng các entry
Trang 75 Vd1 : Giải nén tất cả entry
Trang 76 Vd2: giải nén chỉ 2 entry
Trang 77 string
ZipArchive::getArchiveComment
( void ): Trả về comment của thư
mục nén
Trang 78 string
ZipArchive::getCommentIndex
(int $index [,int $flags]): Trả về
comment của entry sử dụng index
của entry đó
$flags: Nếu được đặt là
thì trả về comment
Trang 79 string
ZipArchive::getCommentName
( int $name [, int $flags ] ): Trả về
comment của entry sử dụng tên của entry đó
$flags: Nếu được đặt là
thì trả về comment
Trang 82 Vd1: lấy file nội dung
Trang 83 Vd2 : Chuyển 1 file ảnh từ một entry được nén
Trang 84 string ZipArchive::getNameIndex
( int $index ): Trả về tên của một
entry sử dụng index của nó
resource ZipArchive::getStream
( string $name ): lấy file điều khiển
để định nghĩa entry bằng tên của nó
mixed ZipArchive::locateName
Trang 85 resource ZipArchive::open ( string
$filename [, int $flags ] ): Mở một
thư mục lưu trữ file zip mới để đọc, ghi hoặc chỉnh sửa
$flags : Các mode dùng để mở file nén
▪ ZIPARCHIVE::OVERWRITE
▪ ZIPARCHIVE::CREATE
Trang 86 bool ZipArchive::renameIndex
( int $index , string $newname): Đổi tên một entry được định nghĩa bởi chỉ số của entry
Trang 87 bool ZipArchive::renameName
( string $name , string $newname ): Đổi tên một entry được định nghĩa bởi tên của entry
Trang 91 mixed ZipArchive::statIndex ( int $index [, int
$flags]): Hàm chứa thông tin về entry được định nghĩa bởi chỉ số
$flags: ZIPARCHIVE::FL_UNCHANGED dùng để yêu cầu thông tin về file gốc trong thư mục nén, loại bỏ tất cả những thay đổi đã thực hiện.
mixed ZipArchive::statName ( name $name [,
int $flags ] ): Hàm chứa thông tin về entry được định nghĩa bởi tên
Trang 92 mixed ZipArchive::unchangeArchive
( void ): trả lại tất cả các thay đổi cục bộ
$index ): trả lại tất cả thay đổi đã hoàn
thành đến entry lúc lấy index
( string $name ): trả lại tất cả các thay đổi đến entry
Trang 93Thường được dùng để đọc/ ghi các file
nén bzip2 ( bz2 )
Trang 94 resource bzopen ( string $filename ,
string $mode ): mở file bzip2 ( bz2)
để đọc và ghi
Trang 95 string bzread ( resource $bz [, int
$length ] ): đọc file nén bzip2
Trang 96 int bzwrite ( resource $bz , string
$data [, int $length ] ) : ghi chuỗi lên file bzip2
Trang 97 int bzclose ( resource $bz ): Đóng
các file bzip2
mixed bzcompress ( string $source
[, int $blocksize [, int
$workfactor ]] ): nén chuỗi và trả ra kiểu bzip2
Trang 98 mixed bzdecompress ( string
$source [, int $small ] ): giải nén cho các chuỗi nén bzip2
Trang 99 int bzerrno ( resource $bz ): trả về mã lỗi của
bzip2 bị lỗi.
array bzerror ( resource $bz ): trả về mã lỗi và
chuỗi lỗi của bzip2 bị lỗi.
string bzerrstr ( resource $bz ) : lấy chuỗi lỗi
int bzflush ( resource $bz ): ghi các dữ liệu còn
trên buffer.
LZF
Trang 100 string lzf_compress ( string $data ):
nén dữ liệu dùng kiểu lzf
string lzf_decompress ( string
$data ): giải nén cho các chuỗi dữ
liệu mã hóa theo lzf
int lzf_optimized_for ( void ): Xác
định những gì đã được LZF tối ưu hóa
Trang 102Add New Album
Trang 103Display Album List
Display Image List
Display Image Detail
Trang 104CREATE TABLE tbl_album (
al_id INT NOT NULL AUTO_INCREMENT,
al_name VARCHAR(64) NOT NULL,
al_description TEXT NOT NULL,
al_image VARCHAR(64) NOT NULL,
al_date DATETIME NOT NULL,
PRIMARY KEY(al_id)
);
CREATE TABLE tbl_album (
al_id INT NOT NULL AUTO_INCREMENT,
al_name VARCHAR(64) NOT NULL,
al_description TEXT NOT NULL,
al_image VARCHAR(64) NOT NULL,
al_date DATETIME NOT NULL,
PRIMARY KEY(al_id)
); CREATE TABLE tbl_image (im_id INT NOT NULL AUTO_INCREMENT,
im_album_id INT NOT NULL, im_title VARCHAR(64) NOT NULL, im_description TEXT NOT NULL, im_type VARCHAR(30) NOT NULL,
CREATE TABLE tbl_image ( im_id INT NOT NULL AUTO_INCREMENT, im_album_id INT NOT NULL,
im_title VARCHAR(64) NOT NULL, im_description TEXT NOT NULL, im_type VARCHAR(30) NOT NULL,
Trang 1201. Cơ sở dữ liệu
4. Code trang add_file.php
Trang 1211. Cơ sở dữ liệu :
Table uploads gồm có các thuộc tính sau:
upload_id int(10) unsigned not null
auto_increment
file_name varchar(30) not null
file_size int(6) unsigned not null
file_type varchar(30) not null
description varchar(100) default null
Trang 1222. Code trang mysql_connect.php: Code trang mysql_connect.php
▪ Thiết lập thông tin CSDL dưới dạng các hằng : define ('DB_USER', "root");
define ('DB_PASSWORD', "");
define ('DB_HOST', "localhost");
define ('DB_NAME', "vidu");
Trang 123▪ Kết nối với MySQL và chọn cơ sở dữ liệu :
$conn = @mysql_connect (DB_HOST,
DB_USER, DB_PASSWORD) OR die ('I
cannot connect to the database because: ' mysql_error());
mysql_select_db (DB_NAME) OR die ('Could
not select the database:' mysql_error());
Trang 124(1) Cho biết việc upload có được phép hay không.
(2) Xác định nơi các tập tin upload được lưu tạm
Trang 125▪ Cấu hình thư mục uploads :
Thiết lập các quyền trên thư mục uploads
để máy chủ có thể ghi chép vào đó
Trước khi lưu tập tin xuống csdl thì tập tin sẽ
được lưu tạm thời trong thư mục uploads với tên tập tin là tạm thời
Trang 126Cấu hình như hình sau:
Trang 1274 Code trang add_file.php :
▪ Kiểm tra xem biểu mẫu được đưa lên không và kiểm tra phần mô tả :
Trang 128- Hàm escape_data() xử lý các giá trị đưa lên để
đảm bảo an toàn cho csdl, cho dù đặc điểm
magic_quotes có kích hoạt hay không.
-Magic_quotes là một đặc điểm tiện lợi được cài đặt sẳn trong php.Khi kích hoạt nó sẽ tự động mã hoá escape các dấu nháy đơn và kép trong giá trị nhận được của các biến.
Trang 129▪ Chèn mẫu tin vào csdl cho phần tải lên:
$query = "INSERT INTO uploads
(file_name,file_size,file_type,description,upload_dat e)
VALUES('{$_FILES['upload']['name']}',
{$_FILES['upload']['size']},'{$_FILES['upload']
['type']}','$d',NOW())";
Trang 130Tập tin tải lên được chèn vào csdl bằng câu truy vấn này.Nó dùng mảng 2 chiều $_FILES để chèn tên tập tin gốc, kích thước và kiểu MIME.Tất cả thông tin này được cung cấp từ trình duyệt
Web.Phần mô tả và thời gian hiện tại cũng được lưu.
Trang 131▪ Tạo tên tập tin mới:
Trang 132- Tập tin được lưu trên máy chủ với tên mới.Điều này
an toàn hơn nếu sử dụng tên gốc do người dùng
đặt.Tên của tập tin sẽ là giá trị của trường upload_id ứng với nó từ csdl (được lấy ra bằng hàm
mysql_insert_id()),theo sau là dấu chấm rồi đến phần
mở rộng tập tin(được xác định bằng cách tách tên tập tin gốc).Ví dụ như tập tin image.jpg được lưu với tên 49.jpg trong uploads