سؤال

أحاول قراءة ملف صورة (.jpeg لتكون بالضبط)، و "صدى" تعود إلى إخراج الصفحة، لكن هل عرض صورة ...

يحتوي index.php الخاص بي على رابط صورة مثل هذا:

<img src='test.php?image=1234.jpeg' />

وبرنامج PHP الخاص بي يفعل أساسا هذا:

1) اقرأ 1234.jpeg 2) محتويات ملف ECHO ... 3) لدي شعور أحتاج إلى إرجاع الإخراج مرة أخرى مع نوع MIME، ولكن هذا هو المكان الذي تضيعه

بمجرد معرفة ذلك، سأزيل إدخال اسم الملف معا واستبداله بمعرف صورة.

إذا كنت غير واضح، أو تحتاج إلى مزيد من المعلومات، يرجى الرد.

هل كانت مفيدة؟

المحلول

دليل PHP لديه هذا المثال:

<?php
// open the file in a binary mode
$name = './img/ok.png';
$fp = fopen($name, 'rb');

// send the right headers
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));

// dump the picture and stop the script
fpassthru($fp);
exit;
?>

النقاط المهمة هي أنه يجب عليك إرسال رأس نوع المحتوى. أيضا، يجب أن تكون حذرا لا تتضمن أي مساحة بيضاء إضافية (مثل Newlines) في الملف الخاص بك قبل أو بعد <?php ... ?> العلامات.

كما هو مقترح في التعليقات، يمكنك تجنب خطر المساحة البيضاء الإضافية في نهاية البرنامج النصي الخاص بك من خلال حذف ?> بطاقة شعار:

<?php
$name = './img/ok.png';
$fp = fopen($name, 'rb');

header("Content-Type: image/png");
header("Content-Length: " . filesize($name));

fpassthru($fp);

لا تزال بحاجة إلى تجنب الفضاء الأبيض بعناية في الجزء العلوي من البرنامج النصي. واحد شكل صعبة للغاية من المساحة البيضاء هو UTF-8 BOM. وبعد لتجنب ذلك، تأكد من حفظ البرنامج النصي ك "ANSI" (المفكرة) أو "ASCII" أو "UTF-8 دون توقيع" (EMACS) أو ما شابه ذلك.

نصائح أخرى

readfile() يستخدم عادة لأداء هذه المهمة كذلك ويبدو أن يكون حلا أفضل من استخدام fpassthru().

إنه يعمل بشكل جيد بالنسبة لي، وفقا ل المستندات, ، لن يقدم أي مشاكل الذاكرة.

إليك مثالي في العمل:

$file_out = "myDirectory/myImage.gif"; // The image to return

if (file_exists($file_out)) {

    //Set the content-type header as appropriate
    $image_info = getimagesize($file_out);
    switch ($image_info[2]) {
        case IMAGETYPE_JPEG:
            header("Content-Type: image/jpeg");
            break;
        case IMAGETYPE_GIF:
            header("Content-Type: image/gif");
            break;
        case IMAGETYPE_PNG:
            header("Content-Type: image/png");
            break;
       default:
            header($_SERVER["SERVER_PROTOCOL"] . " 500 Internal Server Error");
            break;
    }

    // Set the content-length header
    header('Content-Length: ' . filesize($file_out));

    // Write the image bytes to the client
    readfile($file_out);

}
else { // Image file not found

    header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");

}

هذا يجب أن يعمل. قد يكون أبطأ.

$img = imagecreatefromjpeg($filename);
header("Content-Type: image/jpg");
imagejpeg($img);
imagedestroy($img);

عملت دون طول المحتوى. ربما سبب العمل لملفات الصورة عن بعد

// open the file in a binary mode
$name = 'https://www.example.com/image_file.jpg';
$fp = fopen($name, 'rb');

// send the right headers
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: January 01, 2013'); // Date in the past
header('Pragma: no-cache');
header("Content-Type: image/jpg");
/* header("Content-Length: " . filesize($name)); */

// dump the picture and stop the script
fpassthru($fp);
exit;

خيار آخر سهل (ليس أفضل، مختلف تماما) إذا لم تكن قد أقرأ من قاعدة بيانات هو مجرد استخدام وظيفة لإخراج جميع التعليمات البرمجية لك ... ملاحظة: إذا أردت أيضا PHP قراءة أبعاد الصورة وإعطاء ذلك إلى العميل لتقديم أسرع، يمكنك القيام بذلك بسهولة أيضا مع هذه الطريقة.

<?php
  Function insertImage( $fileName ) {
    echo '<img src="path/to/your/images/',$fileName,'">';    
  }
?>

<html>
  <body>
    This is my awesome website.<br>
    <?php insertImage( '1234.jpg' ); ?><br>
    Like my nice picture above?
  </body>
</html>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top