2013-07-08 34 views
5

Tôi đang viết Proxy php đơn giản và tôi gặp khó khăn khi hiển thị tập tin png, đầu ra làLàm thế nào để hiển thị dữ liệu nhị phân từ curl trong php

enter image description here

và nó sẽ là:

enter image description here

Hình ảnh được mở trong Notepad ++. php curl tôi đang xem xét như thế này:

$ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, $ua); 
curl_setopt($ch, CURLOPT_HEADER_OUT, 1); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
$content = curl_exec($ch); 
$info = curl_getinfo($ch); 
header('Content-Type:' . $info['content_type']); 
echo $content 

tôi cố gắng có và không có CURLOPT_BINARYTRANSFER đầu ra là như nhau và hình ảnh không hiển thị. Làm thế nào tôi có thể hiển thị hình ảnh?

EDIT: khi tôi đang lưu dữ liệu đến tập tin và chuyển hướng sử dụng Location tiêu đề hình ảnh được hiển thị một cách chính xác:

$file = fopen('proxy_tmp~', 'w'); 
fwrite($file, $content); 
fclose($file); 
header('Location: ' . DIR . 'proxy_tmp~'); 

EDIT 2: Tôi đã nén gzip, bu khi tôi vô hiệu hóa nó tôi có cùng một vấn đề, khi tôi mở cả hai tập tin trong Notepad ++ một là DOS/Windows ANSI (bản gốc) và khác là DOS/Windows UTF-8 (tập tin được mở bởi một kịch bản). Khi tôi mở một tệp trong Notepad và thay đổi mã hóa thành ANSI và lưu tệp, mọi thứ đều ổn.

EDIT 3: Tôi nghĩ rằng tôi đã làm điều tương tự trên GNU/Linux nhưng không CURLOPT_BINARYTRANSFER lựa chọn và nó làm việc tốt, đây là dự án của tôi https://github.com/jcubic/yapp.

Trả lời

0

Sau đây là cách để gửi các tập tin trực tiếp lại cho người sử dụng để tải về (sử dụng $ của bạn nội dung var):

$file_array = explode("\n\r", $content, 2); 
$header_array = explode("\n", $file_array[0]); 
foreach($header_array as $header_value) { 
$header_pieces = explode(':', $header_value); 
    if(count($header_pieces) == 2) { 
    $headers[$header_pieces[0]] = trim($header_pieces[1]); 
    } 
} 
header('Content-type: ' . $headers['Content-Type']); 
header('Content-Disposition: ' . $headers['Content-Disposition']); 
echo substr($file_array[1], 1); 

Có một ví dụ đầy đủ ở đây:

http://ryansechrest.com/2012/07/send-and-receive-binary-files-using-php-and-curl/

+0

Tôi không muốn gửi tệp để tải xuống, tôi muốn hiển thị hình ảnh trực tiếp vì tôi đang tạo proxy nơi tôi thay đổi url của hình ảnh trên trang. Tôi đơn giản nhận được dữ liệu khác nhau sau đó khi tôi tải các tập tin trực tiếp mà không có kịch bản của tôi. – jcubic

0

nào phiên bản php bạn đang sử dụng? Bạn có ở trên phiên bản PHP 5.1.3 không? Sau đó CURLOPT_BINARYTRANSFER sẽ không có hiệu lực.

Nguồn: http://php.net/manual/en/function.curl-setopt.php

Nhìn vào các tập tin, bạn nên thêm các tiêu đề sau đây để bạn trang:

header('Content-Type: image/png'); 
+0

Tôi sử dụng 'header ('Content-Type:'. $ Info ['content_type']);' sẽ là hình ảnh/png nếu máy chủ gửi tiêu đề đó. Tôi đang sử dụng php 5.2.17. – jcubic

+0

Tiêu đề nào có trong thông tin $ ['content_type']? – Benz

+0

Loại nội dung của phản hồi từ máy chủ. nếu máy chủ trả về 'image/png' thì' $ info ['content_type'] 'sẽ là' image/png' http://pl1.php.net/manual/en/function.curl-getinfo.php. các loại nội dung là ok tôi nhận được dữ liệu khác nhau sau đó khi tôi mở một tập tin trực tiếp mà không có một kịch bản. – jcubic

0

Tôi đã sử dụng sau đây với tiêu đề xác thực cơ bản .. sử dụng để có được người đưa thư auth key

// key : > converted to basic auth 

// Content type 
header('Content-Type: image/jpeg'); 

$url = 'http://com.com.com/api/images/products/264/7971'; 
$headers = array(
    'Content-Type: image/png', 
    'Authorization: Basic @#$%@#$%@#$%@#$%@#$%@#$%'); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
//curl_setopt($ch, CURLOPT_USERPWD, "$login:$password"); 
$file = curl_exec($ch); 
curl_close($ch); 
//echo($result); 

// create image from output of the screen 
$img = @imagecreatefromstring($file); 

if ($img === false) { 
    echo $file; 
    exit; 
} 

$width = imagesx($img); 
$height = imagesy($img); 

$newWidth = 300; 

$ratio = $newWidth/$width; 
$newHeight = $ratio * $height; 


$resized = @imagecreatetruecolor($newWidth, $newHeight); 

if ($resized === false) { 
    echo $file; 
    exit; 
} 

$quality = 90; 

if (@imagecopyresampled($resized, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height)) { 
    @imagejpeg($resized, NULL, $quality); 
} else { 
    echo $file; 
} 
0

Sử dụng $content_arr = explode("\r\n\r\n",$content,2); để chia nội dung thành tiêu đề và nội dung, đặt tiêu đề hình ảnh/png và sau đó làm echo trim($content_arr[1]); để loại bỏ các khoảng trắng hoặc các dòng trống ngăn không cho trình duyệt có thể đọc được hình ảnh.

0

Trong trường hợp của tôi, hãy thêm Content-Length vấn đề cố định tiêu đề với proxy tệp nhị phân.