亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用php輸出圖像

使用php輸出圖像

PHP
青春有我 2023-07-08 22:04:11
有一堆與此標題相同的問題。例如如何使用php輸出圖像?使用 PHP 輸出為圖像如何使用php輸出圖像并下載答案總是一些變化添加header('Content-type: image/jpeg');到您的代碼中毫無疑問,這是答案的重要部分,但遺漏了一些我真的無法解決的重要步驟?,F在,當圖像位于根目錄下時,使用 php 獲取圖像有明顯的好處。假設你有一個網頁<?phprequire_once("load_a_scripts.php");print("lots of html");// fetch image from below root directory and output in HTML?><img id="this_one" src="" height="200" width="200" />您想輸出上面的圖像 this_one 嗎?PHP 可以使用 readfile() 來獲取所需的文件,但這在這里并沒有多大用處(最多你會得到隨機的 unicode 輸出,而不是這里的正確圖像)。防止亂碼輸出的解決方案是使用這顯然在這里似乎不合適。不僅有輸出,這將使得設置標題變得不可能,而且即使這一操作過程成功,人們所能期望的最好的結果就是出現圖像的下載提示。同樣,這不是所需的功能。因此,一些解決方案建議使用一些外部代碼,例如&ldquo;image.php&rdquo;,它將擁有自己的標頭并獲取圖像,等等。然而,這又存在一些問題。image.php 如何知道您想要什么圖像??<?php header('Content-Type:'.$photo);?if(isset($photo)&&isset($type)){? ? ?if(strlen($photo)>15||strlen($type)>6){? ? ? ? die();? ? ? ? }? ? $photo = strtolower($photo);? ? $photo = preg_replace('/[^a-z0-9 -]+/', '', $photo);? ? $photo = str_replace(' ', '-', $photo);? ? $photo = trim($photo, '-');? ? $type = strtolower($type);? ? $type = preg_replace('/[^a-z0-9 -]+/', '', $type);? ? $type = str_replace(' ', '-', $type);? ? $type = trim($type, '-');? ? readfile('../img/'.$user_id.$photo);}假設可以使用 GET 發送與圖像名稱 ($photo) 和 mime ($type) 相關的參數,但同樣,什么發送這些參數以及如何發送?一些答案似乎表明您可以直接鏈接到外部 image.php ,就好像它是圖像一樣<img src="image.php" />?但這再次提出了一個問題:image.php 如何知道 $photo 和 $type 的值。
查看完整描述

1 回答

?
慕娘9325324

TA貢獻1783條經驗 獲得超5個贊

您有兩個基本選項:首先,使用外部圖像加載器/處理程序腳本(例如<img src="image.php?i=sunshine.jpg" />);其次,對圖像數據進行 base64 編碼(例如<img src="data:image/png;base64, i26dfdXAd..." />)。第二個選項會讓你的 HTML 變得臃腫,就像沒有明天一樣。那么讓我們簡單地看一下image.php處理程序方法。

處理程序如何知道要顯示什么圖像?它需要一個查詢字符串,例如image.php?i=sunshine.jpg;或image.php?i=sunshine&x=jpg;或者image.php?i=sunshine&x=jpg&s=600,如果您想加載特定尺寸,等等。您必須在 HTML 源中使用該格式,沒有腳本可以自動知道要加載什么圖像。然后,發送參數的是“誰”(您),而不是“什么”。您需要確保變量得到正確的清理(正如您的示例處理程序所做的那樣);與任何用戶可修改的輸入一樣,它們不應該被信任,尤其是靠近文件系統操作(目錄遍歷等)的任何地方。$_GET['i']這些變量將作為、等供您的處理程序腳本使用$_GET['x']。

如果您覺得 URL 參數很麻煩,或者看起來很臟,您可以隨時重寫 URL。將圖像鏈接為<img src="images/sunshine.jpg" />,并.htaccess在 /images/ 文件夾(僅包含您的腳本)中設置重寫規則,將所有圖像請求傳遞到處理程序腳本。您還可以使用此方法來處理縮小的圖像版本,并將源 URL<img src="images/sunshine__600.jpg" />映射到重寫規則。

關于使用readfile()(脫口而出大塊數據的最內存友好的方式),只要您在調用header('Content-type: image/jpeg');之前輸出(或其他適當的 MIME 標頭)readfile(),它就會以所需的方式工作。也就是說,瀏覽器不會知道網絡服務器直接從文件系統提供的圖像與通過處理程序從網絡根外部提供的圖像之間的區別。它只是帶有圖像 HTTP 標頭的數據。


編輯:獎金。編寫了一個簡約的安全部署文件處理程序。

<?php

/*?

?* Receive image call as: <img src="img.php?i=name.jpg" />

?* Output matching image file from $basepath directory

?*/


$basepath = '../images/'; // Path to image folder


$mimes = [ // Allowed image types:

? ? 'jpg' => 'image/jpeg',

? ? 'png' => 'image/png',

? ? 'gif' => 'image/gif',

? ? 'svg' => 'image/svg+xml',

];


!isset($_GET['i']) && die(); // Nothing to do here.


// Parse & Verify Extension

$ext = strtolower(pathinfo($_GET['i'], PATHINFO_EXTENSION));

!isset($mimes[$ext]) && die('Invalid filetype!'); // If MIME N/A: die!


// Parse & Sanitize Filename?

$file = basename($_GET['i']);

$file = preg_replace('#[^[:alnum:] ._-]#', '', $file);


$filepath = realpath($basepath . $file);

$filepath === false && die('Invalid filename!'); // If image N/A: die!


// Output MIME header and image:

header('Content-Type:' . $mimes[$ext]);

readfile($filepath);

exit;

如果您需要容納jpeg等變體,只需 a) 復制數組中的 MIME 定義$mimes,或 b) 添加擴展規范化例程。如果您需要訪問子文件夾中的圖像,例如?i=sun/shine.jpg,請重新編寫不帶basename.?(確保您不會受到目錄遍歷的影響?。?code>[:alnum:] ._-]將從請求的文件名中刪除除 以外的字符。根據需要修改正則表達式。



查看完整回答
反對 回復 2023-07-08
  • 1 回答
  • 0 關注
  • 224 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號