2012-05-22 40 views
6

Tôi muốn tải tệp từ một URL bên ngoài trực tiếp lên thùng chứa Amazon S3 bằng cách sử dụng PHP SDK. Tôi cố gắng làm điều này với đoạn mã sau:Tải tệp bên ngoài lên thùng AWS S3 bằng cách sử dụng PHP SDK

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $destination, array(
    'fileUpload' => $source, 
    'length' => remote_filesize($source), 
    'contentType' => 'image/jpeg' 
)); 

Trường hợp chức năng remote_filesize như sau:

function remote_filesize($url) { 
    ob_start(); 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_NOBODY, 1); 
    $ok = curl_exec($ch); 
    curl_close($ch); 
    $head = ob_get_contents(); 
    ob_end_clean(); 
    $regex = '/Content-Length:\s([0-9].+?)\s/'; 
    $count = preg_match($regex, $head, $matches); 
    return isset($matches[1]) ? $matches[1] : "unknown"; 
} 

Tuy nhiên, nó sẽ được tốt đẹp nếu tôi có thể bỏ qua việc thiết lập kích cỡ khi tải lên đến Amazon từ điều này sẽ giúp tôi tiết kiệm một chuyến đi đến máy chủ của riêng tôi. Nhưng nếu tôi xóa cài đặt thuộc tính 'length' trong hàm $ s3-> create_object, tôi nhận được thông báo lỗi 'Không thể xác định kích thước luồng cho tải lên trực tuyến'. Bất kỳ ý tưởng làm thế nào để giải quyết vấn đề này?

Trả lời

0

Bạn có quyền kiểm soát máy chủ/máy chủ từ xa không ?. Nếu vậy bạn có thể thiết lập một máy chủ php để truy vấn tệp cục bộ và chuyển dữ liệu cho bạn.

Nếu không, bạn có thể sử dụng thứ gì đó như cuộn tròn để kiểm tra tiêu đề như vậy;

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
var_dump($size); 

Bằng cách này, bạn đang sử dụng yêu cầu HEAD và không tải xuống toàn bộ tệp - vẫn còn, bạn phụ thuộc vào máy chủ từ xa gửi tiêu đề Độ dài nội dung chính xác.

+0

Tôi không có quyền kiểm soát máy chủ/máy chủ từ xa. Tôi đã thử phương pháp được đề xuất, nhưng mặc dù nó chỉ yêu cầu tiêu đề, nó làm chậm đáng kể quá trình. Tôi cũng đã quyết định di chuyển máy chủ của mình sang Amazon (trong cùng vùng có sẵn như nhóm), và bây giờ nó đã tăng tốc. – Bjorn

2

Bạn có thể tải tập tin từ url trực tiếp đến Amazon S3 như thế này (ví dụ của tôi là về một bức tranh jpg):

1. Chuyển đổi các nội dung từ url trong nhị phân

$binary = file_get_contents('http://the_url_of_my_image.....'); 

2 Tạo một đối tượng S3 với một cơ thể để chuyển số nhị phân thành

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $filename, array(
    'body' => $binary, // put the binary in the body 
    'contentType' => 'image/jpeg' 
)); 

Đó là tất cả và nó rất nhanh. Thưởng thức!

+3

Với file_get_contents, trước tiên bạn di chuyển nội dung của tập tin đến máy chủ của bạn, và sau đó đến S3, do đó không loại bỏ lưu lượng bổ sung – Bjorn

+1

Có, bạn là chính xác. Máy chủ đọc dữ liệu trước khi gửi đến S3 (lưu lượng bổ sung và thời gian thêm). Tôi nghĩ bạn gặp khó khăn khi đọc dữ liệu từ Url. Bạn có tìm thấy giải pháp để gửi trực tiếp nội dung đến S3 không? Cảm ơn –

+0

Thật không may là – Bjorn

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