2015-12-29 35 views
1

我有一個函數可以在99%的時間內生成縮略圖。在試圖創建縮略圖的400張圖片中,只有2張圖片失敗。兩張圖片都有單引號,我想知道這是否是問題的根源?如果是這樣,我該怎麼辦才能修復它?如何使用PHP處理文件名中的引號

<?php 

$image = "542Cute pets' hilarious snail dwelling life (06).jpg"; 
$image = "598BK_Fish'n_Crisp.jpg"; 

if ($image) { 
    make_thumb("uploads", "thumbnails", $image, 500); 
    echo $image; 
} 

function make_thumb($imageFrom, $imageTo, $image, $thumbWidth) { 

    /* read the source image */ 
    $getFrom = $imageFrom."/".$image; 

    $imageType = exif_imagetype($getFrom); 

    if ($imageType == IMAGETYPE_JPEG) { 
     $source_image = imagecreatefromjpeg($getFrom);  
    } 
    else if ($imageType == IMAGETYPE_PNG) { 
     $source_image = imagecreatefrompng($getFrom); 
    } 
    else if ($imageType == IMAGETYPE_GIF) { 
     $source_image = imagecreatefromgif($getFrom); 
    } 

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

    /* find the "desired height" of this thumbnail, relative to the desired width */ 
    $thumbHeight = floor($height * ($thumbWidth/$width)); 

    /* create a new, "virtual" image */ 
    $virtual_image = imagecreatetruecolor($thumbWidth, $thumbHeight); 

    /* copy source image at a resized size */ 
    imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, 
         $thumbWidth, $thumbHeight, $width, $height); 

    /* create the physical thumbnail image to its destination */ 

    $dest = $imageTo."/".$image; 

    if ($imageType == IMAGETYPE_JPEG) { 
     imagejpeg($virtual_image, $dest); 
    } 
    else if ($imageType == IMAGETYPE_PNG) { 
     imagepng($virtual_image, $dest); 
    } 
    else if ($imageType == IMAGETYPE_GIF) { 
     imagegif($virtual_image, $dest); 
    } 

} //end of function make_thumb($imageFrom, $imageTo, $image, $thumbWidth) 

?> 

注: 我從數據庫中獲取圖像的名稱。這就是它看起來像在數據庫:

542Cute pets&#039; hilarious snail dwelling life (06).jpg 
598BK_Fish&#039;n_Crisp.jpg 
+0

這取決於你是如何得到的圖像名稱。如果你將它們存儲在一個mysql數據庫中,然後檢索它們,你應該在將它們插入到數據庫之前轉義單引號。 – Brian

+0

@Brian我從數據庫中獲取圖像名稱,並且已經在上面進行了編輯,以向您展示圖像名稱在數據庫中的樣子。 – jessica

+0

嗨@jessica,你可能想要在生成縮略圖之前將其解碼回原來的文件名:$ image = html_entity_decode($ image);因爲它試圖用這個文件名查找圖像:「598BK_Fish ' n_Crisp.jpg」當它實際上是,應該是「598BK_Fish'n_Crisp.jpg」。讓我們知道它是怎麼回事,我也發佈了這個作爲我的答案的評論。 :) –

回答

1

我安全地假設單引號不上名要保留相當多有關,因此,或許你可以嘗試簡單地替換報價一個有效的字符,或者完全刪除它:

$image = str_replace("'", "", $image); //remove entirely 

上str_replace函數的第一個參數可以是一個字符數組,你可能要完全刪除:

$removeArray[] = "'"; 
$removeArray[] = '@'; 
$removeArray[] = "^"; 

$image = str_replace($removeArray, "", $image); 

這些過濾器顯然應該走右後您的實際文件名已被拉到或初始化:

$image = "542Cute pets' hilarious snail dwelling life (06).jpg"; 
$image = str_replace("'", "", $image); 

你可以看到更多關於這裏去掉引號,太:removing single-quote

但是,由於它的出現,你逃脫的文件名與HTML實體保存到數據庫之前。它實際上是修改了您的實際文件名,這樣它看起來:

imagejpeg($virtual_image, "598BK_Fish&#039;n_Crisp.jpg"); //can't find this one, sorry. :(

時,按理說應該尋找:

imagejpeg($virtual_image, "598BK_Fish&'n_Crisp.jpg"); //this exists! 
+0

如果圖像名稱允許使用單引號,爲什麼它不適用於單引號?爲什麼在創建縮略圖時卻不起作用,但上傳原始圖像的作品?我很混亂。 – jessica

+0

嗨@jessica,你好嗎?你提到這是從db中拉出來的樣子:598BK_Fish ' n_Crisp.jpg,對不對?我可以看到,您已經正確地使用html實體(')逃脫了字符(單引號),以便上傳應該可以正常工作。關於創建拇指與make_thumb(..){...}函數一樣,它使用一個「imagejpeg」php函數。當它嘗試渲染圖像時,它實際上會查找:598BK_Fish ' n_Crisp.jpg,如果它不存在,則可能需要將其解碼爲其原始文件名:$ image = html_entity_decode($ image); –

相關問題