Sao chép hình ảnh từ máy chủ từ xa qua HTTP


81

Tôi đang tìm một cách đơn giản để nhập / sao chép hình ảnh từ máy chủ từ xa vào một thư mục cục bộ bằng PHP. Tôi không có quyền truy cập FTP vào máy chủ, nhưng tất cả hình ảnh từ xa có thể được truy cập qua HTTP (tức là http://www.mydomain.com/myimage.jpg ).

Ví dụ sử dụng: Một người dùng muốn thêm hình ảnh vào hồ sơ của mình. Hình ảnh đã tồn tại trên web và người dùng cung cấp URL trực tiếp. Tôi không muốn liên kết nóng hình ảnh mà nhập và phân phát từ miền của tôi.


Máy chủ không có mô-đun proxy cho việc này?
jiggunjer

Câu trả lời:


153

Nếu bạn đã bật PHP5 và trình bao bọc luồng HTTP trên máy chủ của mình, thì việc sao chép nó vào tệp cục bộ vô cùng đơn giản:

copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');

Điều này sẽ xử lý bất kỳ đường ống nào, v.v. cần thiết. Nếu bạn cần cung cấp một số thông số HTTP, bạn có thể cung cấp thông số 'ngữ cảnh luồng' thứ ba.


33
Hãy nhớ allow_url_fopen phải được = bật trong php.ini.
mauro.dec

3
Nhận xét allow_url_fopen vừa được giải quyết trong hơn một giờ đầu. Cảm ơn, @ mauro.dec!
Michael Stalker

2
đang làm gì với các URL như thế này http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop ???
Yuseferi

Cảm ơn vì câu trả lời này - Tôi nghĩ rằng tôi gần như ở đó! Khi bạn nói '/tmp/file.jpg' - điều đó có liên quan gì? ROOT của máy chủ web ... (ví dụ: / var / www / vhosts, v.v.) hoặc gốc của trang web: / httpdocs / ... ?? Không thể thấy các tệp xuất hiện và tôi đã đặt url-fopen thành BẬT. !!
itricky

1
Không sử dụng https, chỉ http
edCoder

31

sử dụng

$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);

cảm ơn anh bạn !! Giải pháp thứ hai đang làm việc .. hàng đầu của tất cả các giải pháp không phải là làm việc cho tôi: p
rajnish

4
Mẹo hay dành cho các tệp nhỏ, nhưng đối với các tệp lớn hơn, bộ nhớ php sẽ bùng nổ :(
Radon8472

10

PHP có một hàm tích hợp file_get_contents (), hàm này đọc nội dung của một tệp thành một chuỗi.

<?php
//Get the file
$content = file_get_contents("http://example.com/image.jpg");

//Store in the filesystem. $fp = fopen("/location/to/save/image.jpg", "w"); fwrite($fp, $content); fclose($fp); ?>

Nếu bạn muốn lưu tệp trong cơ sở dữ liệu, chỉ cần sử dụng biến $ content và không lưu tệp vào đĩa.


2
sử dụng curl là một phương pháp tốt vì một số kẻ máy chủ không hỗ trợ đào tạo Quản lý vì lý do an ninh
Rinto George

1
Đẹp tip cho các tập tin nhỏ, nhưng đối với các file lớn hơn bộ nhớ php sẽ nổ :( curl cũng là sự lựa chọn không tốt, bởi vì nó không có phần nào của php chuẩn
Radon8472

7

Bạn có bốn khả năng sau:

  • Tệp từ xa . Điều này cần allow_url_fopenđược kích hoạt trong php.ini, nhưng đó là phương pháp dễ dàng nhất.

  • Ngoài ra, bạn có thể sử dụng cURL nếu cài đặt PHP của bạn hỗ trợ nó. Thậm chí còn có một ví dụ .

  • Và nếu bạn thực sự muốn làm điều đó theo cách thủ công, hãy sử dụng mô-đun HTTP .

  • Thậm chí không cố gắng sử dụng ổ cắm trực tiếp .


Tại sao "Thậm chí không cố gắng sử dụng ổ cắm trực tiếp."? (Đó là những gì tôi đang sử dụng, gist.github.com/0893a7ec908ff508aac6 )
Gajus

@Gajus: Bạn không sử dụng ổ cắm trực tiếp trong đoạn mã đó. Bạn đang sử dụng khả năng của php để mở các tệp từ xa.
Georg Schölly

4

Đây là cách cơ bản nhất:

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";

$rfile = fopen($url, "r");
$lfile = fopen($dir . basename($url), "w");

while(!feof($url)) fwrite($lfile, fread($rfile, 1), 1);

fclose($rfile);
fclose($lfile);

Nhưng nếu bạn đang làm rất nhiều việc này (hoặc máy chủ của bạn chặn quyền truy cập tệp vào các hệ thống từ xa), hãy cân nhắc sử dụng CURL, hiệu quả hơn, nhanh hơn một chút và khả dụng trên nhiều máy chủ được chia sẻ hơn.

Bạn cũng có thể giả mạo tác nhân người dùng để trông giống như một máy tính để bàn hơn là một bot!

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$lfile = fopen($dir . basename($url), "w");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_FILE, $lfile);

fclose($lfile);
curl_close($ch);

Với cả hai trường hợp, bạn có thể muốn chuyển nó qua GD để đảm bảo rằng nó thực sự là một hình ảnh.


1
Để kiểm tra hình ảnh bằng GD, hãy cân nhắc chạy tính năng này ngay sau khi bạn lưu tệp: psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - nếu nó trở lại sai, hãy xóa tệp ngay lập tức.
Oli

4
Bạn đã bỏ lỡ curl_exec($ch)trước đó curl_close($ch)fclose($ch)nên được đặt ở cuối hơn là trước đó curl_close($ch), điều đó có nghĩa là hãy đóng tệp trước khi không có gì được ghi vào tệp, do đó bạn sẽ chỉ nhận được một tệp trống.
Hendra Uzia

2

Nó cực kỳ đơn giản bằng cách sử dụng file_get_contents . Chỉ cần cung cấp url làm tham số đầu tiên.


1
Điều này bị khóa đối với hệ thống tệp cục bộ trên nhiều máy chủ được chia sẻ vì lý do bảo mật. cURL tốt hơn, nhanh hơn, mạnh hơn, v.v. Và thường có sẵn trên những máy chủ chặn fopen trên hệ thống tệp từ xa.
Oli

nếu cURL có sẵn, điều đó sẽ còn tốt hơn. xem <a href=" se2.php.net/curl"> cUrl tại php.net </a>
PatrikAkerstrand

2

tạo thư mục và đặt tên cho nó, ví dụ, tải xuống mở bảng ghi chú và chèn mã này

chỉ thay đổi http://www.google.com/aa.zip thành tệp của bạn và lưu nó vào m.php chẳng hạn

sửa đổi tệp php thành 666 và tải xuống thư mục thành 777

<?php
define('BUFSIZ', 4095);
$url = 'http://www.google.com/aa.zip';
$rfile = fopen($url, 'r');
$lfile = fopen(basename($url), 'w');
while(!feof($rfile))
fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
fclose($rfile);
fclose($lfile);
?>

cuối cùng từ trình duyệt của bạn, hãy nhập vào URL này http://www.example.com/download/m.php

bạn sẽ thấy trong thư mục tải xuống tệp tải xuống từ máy chủ khác

cảm ơn


0

Sử dụng yêu cầu GET để tải xuống hình ảnh và lưu vào thư mục có thể truy cập web trên máy chủ của bạn.

Khi bạn đang sử dụng PHP, bạn có thể sử dụng curlđể tải xuống tệp từ máy chủ khác.


0

Vì bạn đã gắn thẻ câu hỏi của mình là 'php', tôi sẽ giả định rằng bạn đang chạy php trên máy chủ của mình. Đặt cược tốt nhất của bạn là nếu bạn kiểm soát máy chủ web của riêng mình, sau đó biên dịch cURL thành php. Điều này sẽ cho phép máy chủ web của bạn thực hiện yêu cầu đến các máy chủ web khác. Điều này có thể khá nguy hiểm theo quan điểm bảo mật, vì vậy hầu hết các nhà cung cấp dịch vụ lưu trữ web cơ bản sẽ không bật tùy chọn này.

Đây là trang php man về cách sử dụng cURL . Trong các nhận xét, bạn có thể tìm thấy một ví dụ về tải xuống và tệp hình ảnh.

Nếu bạn không muốn sử dụng libcurl, bạn có thể viết mã thứ gì đó bằng fsockopen. Điều này được tích hợp trong php (nhưng có thể bị tắt trên máy chủ của bạn) và có thể đọc và ghi trực tiếp vào các ổ cắm. Xem Ví dụ trên trang người đàn ông fsockopen .


0

Đối với những người cần giữ tên tệp gốc và phần mở rộng

$origin = 'http://example.com/image.jpg';

$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);

$dest = 'myfolder/' . $filename . '.' . $ext;

copy($origin, $dest);

-5

Câu trả lời này đã giúp tôi tải hình ảnh từ máy chủ sang phía máy khách.

<a download="original_file.jpg" href="file/path.jpg">
  <img src="file/path.jpg" class="img-responsive" width="600" />
</a>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.