2012-03-23 27 views
13

Tôi có đoạn mã sau:Sao chép tập tin từ máy chủ từ xa hoặc URL

$file = 'http://3.bp.blogspot.com/-AGI4aY2SFaE/Tg8yoG3ijTI/AAAAAAAAA5k/nJB-mDhc8Ds/s400/rizal001.jpg'; 
$newfile = '/img/submitted/yoyo.jpg'; 

if (copy($file, $newfile)) { 
    echo "Copy success!"; 
}else{ 
echo "Copy failed."; 
} 

và nó luôn luôn đầu ra "Copy thất bại"

copy(/img/submitted/yoyo.jpg) [function.copy]: failed to open stream: No such file or directory 

thư mục của tôi được thiết lập để 777.

bất kỳ ý tưởng? cảm ơn!

Trả lời

45

Trong khi copy() sẽ chấp nhận một URL như là nguồn luận , nó có thể là có vấn đề một url cho điểm đến .

Bạn đã thử chỉ định đường dẫn hệ thống tệp đầy đủ đến tệp đầu ra chưa? Tôi giả sử bạn không cố gắng để đưa tập tin mới vào một máy chủ từ xa.

Ví dụ:

$file = 'http://3.bp.blogspot.com/-AGI4aY2SFaE/Tg8yoG3ijTI/AAAAAAAAA5k/nJB-mDhc8Ds/s400/rizal001.jpg'; 
$newfile = $_SERVER['DOCUMENT_ROOT'] . '/img/submitted/yoyo.jpg'; 

if (copy($file, $newfile)) { 
    echo "Copy success!"; 
}else{ 
    echo "Copy failed."; 
} 

Trên đây làm việc độc đáo cho tôi.

+1

hoàn hảo, cảm ơn Mark! – Kris

+1

$ _SERVER ['DOCUMENT_ROOT'] đã làm phép thuật cho tôi ... Cảm ơn rất nhiều. –

+0

Tôi đã thay thế '$ _SERVER ['DOCUMENT_ROOT']' bằng '__DIR__' và làm cho nó hoạt động. Kiểm tra phiên bản PHP của bạn để đảm bảo rằng nó có sẵn. – johnsnails

4

Nếu tệp không được truy cập công khai thì bạn không thể sao chép tệp từ máy chủ mà không có quyền truy cập vào tệp đó.

Bạn có thể sử dụng ftp_get() để mở kết nối FTP và sao chép tệp.

$local_file = 'localname.zip'; // the nam 
$server_file = 'servername.zip'; 
$conn = ftp_connect($ftp_server); 

$login_result = ftp_login($conn, $ftp_user_name, $ftp_user_pass); 

if (ftp_get($conn, $local_file, $server_file, FTP_BINARY)) { 
    echo "Successfully copied"; 
} 
ftp_close($conn); 

Nhưng, Nếu bạn muốn tải về một tập tin từ URL

$fullPath = "filepath.pdf"; 

if ($fd = fopen ($fullPath, "r")) { 
    $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts["extension"]); 
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
    header("Content-length: $fsize"); 
    header("Cache-control: private"); //use this to open files directly 
    while(!feof($fd)) { 
     $buffer = fread($fd, 2048); 
     echo $buffer; 
    } 
} 
fclose ($fd); 
+0

Kết nối 'ftp' có liên quan gì đến việc sao chép tệp từ máy chủ' http'? Ngoài ra, may mắn là các nhà cung cấp ít và ít sử dụng giao thức 'ftp' đã lỗi thời hoàn toàn. Đây không phải là câu trả lời, xin lỗi. – arkascha

+0

@arkascha, tôi đã viết lại câu trả lời của mình nếu điều đó làm rõ mọi thứ. Và tôi phủ nhận bình luận của bạn về việc tuyên bố câu trả lời của tôi là "không phải là câu trả lời". Bởi vì FTP vẫn được sử dụng rộng rãi trong thế giới phát triển web và thậm chí nếu nó đã lỗi thời, nó vẫn sẽ là một câu trả lời cho thấy một triển khai lỗi thời nhưng vẫn sẽ là một câu trả lời. – Starx

+0

Tệp không được truy cập công khai không phải là câu hỏi hay vấn đề. Bạn đã trả lời một câu hỏi không được hỏi. Đúng là không may một số nhà cung cấp dịch vụ vẫn sử dụng giao thức cũ mặc dù các lựa chọn thay thế tốt hơn tồn tại, do đó buộc người dùng của họ hiển thị thông tin cá nhân và dữ liệu cho mọi người nghe. Nhưng vẫn còn câu hỏi là làm thế nào để sử dụng chức năng sao chép của php để truy cập một tập tin từ xa. Mà bạn không trả lời gì cả. – arkascha

6

tôi thấy chức năng này trong một trong những dự án cũ của tôi.

private function download_file ($url, $path) { 

    $newfilename = $path; 
    $file = fopen ($url, "rb"); 
    if ($file) { 
    $newfile = fopen ($newfilename, "wb"); 

    if ($newfile) 
    while(!feof($file)) { 
     fwrite($newfile, fread($file, 1024 * 8), 1024 * 8); 
    } 
    } 

    if ($file) { 
    fclose($file); 
    } 
    if ($newfile) { 
    fclose($newfile); 
    } 
} 
+0

cảm ơn @jonathan, cái này cũng phù hợp với tôi. :) – Kris

Các vấn đề liên quan