2013-11-21 29 views
0

我有一個img標記,其中定義了一個src值。不過,我不想顯示這個值,因爲它會影響我的服務器。我被推薦使用虛擬URL:IMG標記引用了一個URL,但是在這種方案中,URL是虛擬URL:/uploads/myuser/mypict.jpg不會直接映射到映像,而是一個重寫規則會將此URL作爲參數傳遞給/uploads.php?url=myuser/mypict.jpg腳本,並且此腳本將具有訪問和發送Web根目錄之外的文件內容的能力(Web服務器根目錄不適用於腳本的文件處理功能)Source如何處理img標籤中的虛擬URL?

但我不明白img標記如何訪問PHP腳本,以及該腳本如何顯示img標記中的圖像。

任何想法,我怎麼能實現它?

更新:

我會給一個答覆標記所有的你,......但是我不能。 我終於找到了一種不帶任何參數的腳本調用方法,因爲圖像的名稱和路徑存儲在數據庫中。我與Symfony2的工作,所以我給我的特殊解決方案:

我只是做一個枝杈模板:

<img src="{{ path('acme_home_seeImage') }}" width="{{ image.width }}" height="{{ image.height }}"> 

,並添加路徑:

acme_home_seeImage: 
    pattern: /seeImage 
    defaults: { _controller: AcmeHomeBundle:Home:seeImage} 

然後,當加載頁面時,所述img標籤觸發seeImageAction()方法,可處理下面的代碼:

public function seeImageAction() 
{ 
    if(!isset($_SESSION)) session_start(); 
    header('Content-type: image/png'); 
    if(isset($_SESSION['id'])) { 
     //call to image in database 
     $em = $this->getDoctrine()->getEntityManager(); 
     $image = $em->getRepository('AcmeHomeBundle:Image')->find($_SESSION['id']); 
     readfile($image->getPath()); 
    } else { 
     readfile('public/img/default.png'); 
    } 
} 

,因爲圖像與客戶端的會話ID相關聯。 就是這樣!現在,我可以將Document Root以外的上傳目錄成功,並且我的上傳路徑保持隱藏狀態。

回答

2

讓我用一個小ASCII藝術澄清這一點。

Browser      Server 
    | 
    | requests HTML 
    |--------------------------->| 
           | sends HTML back 
    |<---------------------------| 
    | 
    | reads HTML, 
    | finds <img>, re- 
    | solves URL to 
    | image from src attribute 
    | 
    | requests image /foo.jpg 
    |--------------------------->| 
           | searches foo.jpg, 
           | but doesn't find 
           | it. Configured to 
           | call PHP script in this case: 
           | 
           |-----------------------> PHP script called 
                  with URL foo.jpg. 
                  Checks, if user has 
                  right to view, and 
                  if so, reads bar.jpg 
           |<----------------------- and outputs that 
           | 
           | Takes output from PHP 
           | and sends it to browser 
    |<---------------------------| 
    | 
    | receives image bar.jpg, 
    | but doesn't know. For the 
    | browser it's called /foo.jpg 

訣竅是,/foo.jpg不存在,但服務器調用PHP腳本。這做權利管理並返回正確的數據。請注意,bar.jpg不能通過服務器訪問,也就是說,要求/bar.jpg給出401 Forbidden(或更好的情況,bar.jpg存儲在完全不同的地方)。

3

IMG SRC屬性鏈接到類型爲「image」的資源。一張圖像是一袋八位字節。所以你的服務器必須做的是發回一袋八位字節:)

通常,SRC屬性是由服務器解釋爲磁盤上的路徑的文件名。重要的是服務器發送一個圖像,而不管它的起源。所以它可能是磁盤上的文件或腳本生成的圖像,它並不在意。

如果鏈接指向腳本,腳本必須做的唯一事情就是生成一個圖像並確保發送正確的標頭。使用PHP,您可以通過多種方式生成圖像(在文件系統上讀取並輸出圖像,從頭生成圖像,通過克隆/修改現有圖像生成圖像,...),然後爲頭文件生成the header function

這篇文章可能會激勵你:how to send png image from server to display in browser via ajax(阿列克謝的迴應是你的迴應)。

2

如果PHP腳本標題設置爲

header('Content-Type: image/jpg'); 

那麼PHP腳本顯示爲JPG格式(以IMG SRC),就像/uploads/myuser/mypict.jpg

這裏有一個例子:

<?php 
    header('Content-Type: image/jpg'); 
    readfile('/uploads/myuser/mypict.jpg'); 
?> 

然後你就可以像這樣訪問:

<img src="imghandler.php" alt="mypict.jpg"/ >