2012-08-07 33 views
5

Tôi muốn tải xuống tệp từ xa và đặt tệp đó vào thư mục máy chủ của mình có cùng tên với tên gốc. Tôi đã cố gắng sử dụng file_get_contents($url).Không thể lấy tên tệp từ xa vào file_get_contents() và sau đó lưu trữ tệp

Vấn đề là tên tệp không được bao gồm trong $url, nó giống như: www.domain.com?download=1726. URL này cung cấp cho tôi, ví dụ: myfile.exe, vì vậy tôi muốn sử dụng file_put_contents('mydir/myfile.exe');.

Tôi làm cách nào để có thể truy xuất tên tệp? Tôi đã thử get_headers() trước khi tải xuống nhưng tôi chỉ có kích thước tệp, ngày sửa đổi và các thông tin khác, tên tệp bị thiếu.

+0

Hãy nhìn vào cURL nó nên bao gồm những gì bạn cần http: // php.net/manual/en/book.curl.php – Waygood

+0

Xem câu hỏi này cho tên tệp cURL http://stackoverflow.com/questions/1750055/with-php-curl-get-filename-from-file-header – Waygood

Trả lời

0

file_get_contents() qua trình bao bọc HTTP không tải xuống trực tiếp tệp nếu tệp đã được máy chủ web phân tích cú pháp trước.

Lấy ví dụ sau: nếu bạn gọi file_get_contents() trên một trang web remove (example.com/foobar.php), bạn sẽ không được trình bày với các mã nguồn của foobar.php, nhưng làm thế nào các máy chủ web của example.com phân tích các file PHP. Vì vậy, bạn sẽ chỉ có thể truy xuất đầu ra HTML được tạo ra.

Nếu tên tệp không có trong URL và không có cách nào bạn có thể tìm nạp nó từ bất kỳ đâu, thì bạn đang ở trong một ngõ cụt. Dữ liệu không thể chỉ là được triệu hồi từ trường siêu dữ liệu.

Đối với các giải pháp thay thế, tôi chỉ có thể đề nghị sử dụng các thư viện cURL (nó được sử dụng để xử lý các truy vấn từ máy chủ của bạn (như thể nó là một khách hàng) đến các máy chủ khác với việc sử dụng URL, vì thế mà tên cient URL) hoặc file sockets . Dưới đây là another question's answer on Stack Overflow mô tả cách lấy tên tệp bằng cách sử dụng cURL.

Ngoài ra, bạn có thể thử liên hệ với nhóm quản trị viên/người duy trì/quản trị viên web domain.com, hỏi xem họ có API công khai để tìm nạp tên tệp và siêu dữ liệu khác hay không.

+0

Cảm ơn Bạn trả lời nhanh. Tôi sẽ thử cURL. Nhưng tôi vẫn tự hỏi, làm thế nào trình duyệt biết chính xác tên tập tin? Khi tôi đặt url này trong trình duyệt, tôi nhận được nhắc nhở lưu cửa sổ với tên tập tin thực. Vì vậy, khi tôi sử dụng trước đây: ini_set ('user_agent', 'Mozilla/5.0 (X11; U; Linux i686; vi-Mỹ; rv: 1.9.0.16) Gecko/2009121601 Ubuntu/9.04 (vui nhộn) Firefox/3.0.16 '); Tôi nghĩ tôi giống như một trình duyệt :) – Peter222

+0

[RFC 2183] (http://www.ietf.org/rfc/rfc2183.txt) mô tả tiêu đề 'Nội dung-Bố trí:' và có thể chứa chỉ thị 'filename'. Các trình duyệt phân tích cú pháp phần này của tiêu đề và chúng tìm nạp nhiều siêu dữ liệu khác nhau từ nó. Kiểm tra câu trả lời tôi liên kết là có liên quan trong câu trả lời của tôi, nó mô tả một phương pháp làm thế nào có thể lấy một tiêu đề này bằng cách sử dụng PHP (và cURL). – Whisperity

+0

Tôi đã thử nghiệm tất cả các ví dụ ở trên. Không thành công. Tôi đã thử đầy đủ lớp ví dụ này: http://stackoverflow.com/questions/6177661/how-do-download-a-file-with-curl nhưng không thể lấy tên tệp gốc bằng cURL. Ngay cả khi tên tệp được bao gồm trong URL. Ai đó có thể đặt ví dụ làm việc dựa trên bất kỳ tệp công khai nào (jpg hoặc thứ gì đó). Chỉ cần tải xuống từ xa và lưu cục bộ có cùng tên. Tôi sẽ rất biết ơn. Googling 2 ngày, không có ý tưởng: ( – Peter222

7

Tôi đã giải quyết theo cách khác. Tôi thấy rằng nếu không có bố cục nội dung trong tiêu đề url, thì tên tệp tồn tại trong URL. Vì vậy, mã này làm việc với bất kỳ loại URL (không cURL cần thiết):

$url = "http://www.example.com/download.php?id=123"; 
// $url = "http://www.example.com/myfile.exe?par1=xxx"; 
$content = get_headers($url,1); 
$content = array_change_key_case($content, CASE_LOWER); 

    // by header 
if ($content['content-disposition']) { 
    $tmp_name = explode('=', $content['content-disposition']); 
    if ($tmp_name[1]) $realfilename = trim($tmp_name[1],'";\''); 
} else 

// by URL Basename 
{ 
    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    $realfilename = basename($stripped_url); 

} 

Nó hoạt động! :)

+0

+1. Nó rất hữu ích, nhưng tại sao bạn không chấp nhận nó như là câu trả lời? Có vấn đề với mã này không? – aliqandil

5

Dựa trên mã của Peter222 tôi đã viết một hàm để lấy tên tệp. Bạn có thể sử dụng biến $ http_response_header:

function get_real_filename($headers,$url) 
{ 
    foreach($headers as $header) 
    { 
     if (strpos(strtolower($header),'content-disposition') !== false) 
     { 
      $tmp_name = explode('=', $header); 
      if ($tmp_name[1]) return trim($tmp_name[1],'";\''); 
     } 
    } 

    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    return basename($stripped_url); 
} 

Cách sử dụng: ($ http_response_header sẽ được lấp đầy bởi file_get_contents())

$url = 'http://example.com/test.zip'; 
$myfile = file_get_contents($url); 
$filename = get_real_filename($http_response_header,$url) 
Các vấn đề liên quan