Hướng dẫn dùng file url trong PHP

Để lưu file (ảnh, video) từ 1 url, trong php có rất nhiều cách làm, chúng tôi VinaSupport đã tổng hợp 4 cách sau:

  1. Hàm file_get_contents, file_put_contents
  2. Hàm copy
  3. Sử dụng fopen
  4. Sử dụng CURL

1. Hàm file_get_contents, file_put_contents

Sử dụng hàm file_get_contents để lấy nội dung của của url và file_put_contents để lưu lại nội dung thành file.

$url = 'https://vinasupport.com/assets/img/vinasupport_logo.png';
$saveUrl = '/tmp/vinasupport_logo.png';
file_put_contents($saveUrl, file_get_contents($url));

Tham khảo Doc của PHP ở đây.

  • https://www.php.net/manual/en/function.file-get-contents.php
  • https://www.php.net/manual/en/function.file-put-contents.php

Yêu cầu tham số allow_url_fopen trong php.ini phải set là true

2. Hàm copy

copy('https://vinasupport.com/assets/img/vinasupport_logo.png', '/tmp/vinasupport_logo.png');

Tham khảo Doc của hàm copy ở đây, nó cũng yêu cầu tham số allow_url_fopen trong php.ini phải set là true

  • https://www.php.net/manual/en/function.copy.php

3. Sử dụng fopen

Một phương án khác là các bạn sử dụng hàm fopen, fread, fwrite để xử lý lưu file như bên dưới

$in = fopen('https://vinasupport.com/assets/img/vinasupport_logo.png', "rb");
$out = fopen('/tmp/vinasupport_logo.png', "wb");
while ($chunk = fread($in,8192))
{
    fwrite($out, $chunk, 8192);
}
fclose($in);
fclose($out);

4. Sử dụng CURL

Đây là phương án xử lý lưu file tốt nhất và hiệu quả nhất hiện này với rất nhiều tùy chọn.

set_time_limit(0);
$image = 'https://vinasupport.com/assets/img/vinasupport_logo.png';
// Save image name
$saveImageName = basename($image);
// Save Image Path
$saveImagePath = '/tmp/' . $saveImageName;
// This is the file where we save the information
$fp = fopen ($saveImagePath, 'w+');
// Here is the file we are downloading, replace spaces with %20
$ch = curl_init(str_replace(" ","%20",$image));
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
// write curl response to file
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// get curl response
curl_exec($ch);
curl_close($ch);
fclose($fp);

Nguồn: vinasupport.com

Bên cạnh cách thông tin đấy lên server qua form chúng ta cũng sử dụng url làm phương tiện rất hữu hiệu để truyền các tham số cần thiết không cần qua form. 

Việc sử dụng tham số trên URL thường giúp chúng ta sử dụng để đẩy các thông tin cần đều hướng và xử lý trong hệ thống của chúng ta. 

Ví dụ chúng ta cần thực hiện hành động edit một bài viết ta có thể đẩy lên url theo đường link như sau

yourdomain.com?mod=post&view=edit&id=10

Giải thích: Trong url trên ta đẩy lên 3 tham số

- mod: Module xử lý

- view: View xử lý

- id: ID bài viết cần xử lý

CÁCH XÂY DỰNG URL CÓ CHỨA THAM SỐ

yourdomain.com?mod=course&view=main
  • Chuổi các tham số bắt đầu sau dấu ?   phía sau file xử lý
  • Các cặp thông tin ở dạng key=value và kết nối với nhau bởi ký tự 
  • Tổng thông tin các tham số truyền lên có độ dài được hỗ trợ 2000 ký tự &

CÁCH LẤY DỮ LIỆU THAM SỐ URL

  • Để lấy giá trị của các tham số trên URL ta sử dụng biến $_GET
  • Khi URL có tham số thì thông tin của các cặp tham số được gửi vào mảng hệ thống $_GET
<?php 
$mod = $_GET['mod'];
$view = $_GET['view'];
?>

Ghi nhớ

  • Truyền dữ liệu qua tham số url giúp ta xây dựng hệ thống điều hướng và xử lý chức năng trong website
  • Biến $_GET là phương tiện giúp chúng ta lấy các tham số từ Url

Url Link

http://hocweb123.com/truyen-tham-so-qua-url-trong-php.html

Nhiều lúc bạn rất muốn tải hình ảnh từ bất kỳ đường dẫn của Website nào, một cách rất đơn giản đó là click chuột phải và ấn lưu hình ảnh. Nhưng trong lập trình bạn muốn tải ảnh từ url thì bạn phải viết chương trình để máy tính có thể hiểu được để tải ảnh cho bạn. Vì vậy trong bài viết này vncoder.vn sẽ hướng dẫn cách lưu ảnh từ đường dẫn URL trong PHP.

Có 2 cách để bạn có thể lấy ảnh từ website khác:

  • Sử dụng cách xử lý tập tin cơ bản.
  • Sử dụng một thư viện HTTP gọi là cURL.

Cả 2 cách để lưu ảnh trong php này đều có ưu điểm và nhược điểm riêng, giờ chúng ta đi vào từng cách dùng cụ thể nhé.

1. Sử dụng cách Xử lý tệp cơ bản

Đây là cách cơ bản và dễ nhất để hoàn thành nhiệm vụ. Cũng giống như bất kỳ tập tin nào khác, hãy bắt đầu với việc tạo một tập tin trống và mở nó trong chế độ ghi (write). Sau đó, tìm lấy nội dung từ URL nguồn và dán nó vào tệp này. Chỉ đơn giản vậy thôi.

Từ kịch bản trên ta có các bước cụ thể như sau:

  • Khai báo hai biến có tên là $url và $img , tương ứng với URL nguồn và tệp đích.
  • Sử dụng hàm file_put_contents() để viết một chuỗi vào một tệp có hai đối số. Một là tên tệp (hoặc đường dẫn) và hai là nội dung của tệp đó.
  • Sử dụng hàm file_get_contents() để đọc tệp thành một chuỗi.

Ví dụ:

<?php
$url =
'https://vzn.vn/wp-content/uploads/2019/04/hinhnendangnhap-2.png';
$imgpath = '/path/to/save/images/new_name.png';
// Function to write image into file
file_put_contents($imgpath, file_get_contents($url));
echo "Lưu ảnh thành công!"
?>

Lưu ý: Code trên lưu hình ảnh vào máy chủ với tên new_name.png đã đặt ở trên.

Nhược điểm: Bây giờ vấn đề duy nhất với phương thức này là nó yêu cầu cấu hình allow_url_fopen được bật và được đặt thành 1 theo mặc định. Nhưng đôi khi, các yêu cầu của dự án không cho phép có tùy chọn này. Điều này có thể là do một số biện pháp phòng ngừa an ninh hoặc chỉ là một nguyên tắc thiết kế. Trong những trường hợp như vậy chúng ta có một phương pháp khác để lưu hình ảnh.

2. Sử dụng thư viện HTTP, cURL

Nói đúng ra, cURL không chỉ là thư viện HTTP. Nó cũng có một số giao thức truyền dữ liệu khác. Vì hình ảnh của chúng ta nằm trên máy chủ HTTP, chúng ta sẽ giới hạn bản nghiên cứu một phần nhỏ của thư viện này.

cURL cho phép thực hiện các yêu cầu HTTP trong PHP. Bắt đầu bằng cách khởi tạo một thể hiện của nó và thiết lập một số tùy chọn cần thiết cho yêu cầu, bao gồm cả URL. Sau đó thực hiện truy vấn này trả về nội dung của tệp. Sau đó, phần còn lại của thủ tục là như nhau. Ngay sau khi chúng ta nhận được dữ liệu, hãy đặt nó vào một tệp và lưu nó. (Giống cách bên trên).

Các bước cụ thể

  • Trong tập lệnh này, chúng ta sẽ viết một hàm file_get_contents_curl để sao chép hành vi của file_get_contents từ kỹ thuật được đề cập trước đó.
  • Bên trong hàm này, chúng ta sẽ khởi tạo một thể hiện của cURL bằng cách sử dụng hàm curl_init để sử dụng nó trong việc tìm nạp dữ liệu.
  • Sau đó, một số tùy chọn cần được đặt bằng curl_setopt để ví dụ cụ thể này có thể hoạt động. Hàm này có ba đối số
    • Một ví dụ của cURL
    • Tùy chọn tương ứng cần được đặt
    • Và giá trị mà tùy chọn được đặt
  • Trong ví dụ này, các tùy chọn sau được đặt:
    • CURLOPT_HEADER, nghĩa là đảm bảo bạn có cần nhận các tiêu đề hay không;
    • CURLOPT_RETURNTRANSFER chuyển dữ liệu dưới dạng giá trị trả về của hàm curl_exec thay vì xuất trực tiếp.
    • Đây là một tùy chọn khác CURLOPT_URL đặt URL cho yêu cầu.
  • Sau đó, chúng tôi lấy dữ liệu từ curl_exec và trả về từ hàm cha.
  • Dữ liệu này sau đó được ghi vào tệp trên máy của bạn bằng file_put_contents .

Ví dụ cụ thể:

<?php
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$data = file_get_contents_curl(
'https://vzn.vn/wp-content/uploads/2019/04/hinhnendangnhap-2.png');
$fp = '/path/to/save/images/new_name.png';
file_put_contents( $fp, $data );
// Function to write image into file
file_put_contents( $fp, $data );
echo "Lưu ảnh thành công!"
?>

Phương pháp này cung cấp một chút linh hoạt trong khi tìm nạp nội dung từ internet. Như đã đề cập trước đó, nó không chỉ giới hạn ở HTTP mà còn có thể được sử dụng trong nhiều trường hợp khác. Nó cho phép cấu hình chuyển đổi theo bất cứ cách nào bạn muốn. Ví dụ: file_get_contents chỉ sử dụng một yêu cầu GET đơn giản để tìm nạp dữ liệu, nhưng với cURL, có thể sử dụng GET, POST, PUT và các phương thức khác.

3. Kết luận

Trên đây là 2 cách lưu ảnh từ đường dẫn URL trong PHP mà vncoder.vn đã hướng dẫn rất chi tiết cho các bạn. Hy vọng với bài viết này sẽ giúp ích cho các bạn. Chúc bạn thành công!.

4. Xem thêm

  • [PHP] Làm việc với file và các hàm xử lý file trong PHP

  • [PHP] Hướng dẫn upload ảnh sử dụng Ajax kết hợp PHP

  • [Laravel] Hướng dẫn tích hợp Google reCAPTCHA trong Laravel