2012-01-28 3 views
0

мой последний вопрос занят, поэтому я должен открыть новый. (прочитайте мой последний вопрос here). im пытается перенаправить запрос в файл watermark.php, чтобы вставить логотип в изображения, которые вызывались из-за пределов моего веб-сайта. но когда я использую этот код для файла .htaccess:Watermark через php

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC] 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !localhost [NC] 
RewriteCond %{HTTP_REFERER} !friendlysite\.com [NC] 
RewriteCond %{HTTP_REFERER} !google\. [NC] 
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC] 

RewriteRule (.*) /watermark.php?pic=$1 

и это для watermark.php:

<?php 
// Load the stamp and the photo to apply the watermark to 
$stamp = imagecreatefrompng('tbwm.png'); 
$im = imagecreatefromjpeg($_GET['pic']); 

// Set the margins for the stamp and get the height/width of the stamp image 
$marge_right = 10; 
$marge_bottom = 10; 
$sx = imagesx($stamp); 
$sy = imagesy($stamp); 

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp)); 

// Output and free memory 
header('Content-type: image/png'); 
imagepng($im); 
imagedestroy($im); 
?> 

файл PHP просто отобразить альт тег IMG файла и вернуть эту ошибку: The requested URL /watermark.php was not found on this server. и когда я открываю непосредственно watermark.php, эта ошибка возвращается: The image http://192.168.1.190/hotlinking/watermark.php cont not be displayed because it contains errors.

В чем проблема?

+0

Что вы имеете в виду под «php-файлом, просто отображающим альт-тег файла img»? – giorgio

+0

hum mm, посмотрите на это: 'Please visit my site to see this picture .visit w3 для получения дополнительной информации @' http: // www.w3schools.com/tags/att_img_alt.asp' – bizzr3

ответ

1

На стороне примечания: Вам нужно проверить, существует ли изображение перед отображением изображения, и показать другой img, если не найден. например:

<?php 
$pathToImage='./images/'.basename($_GET['pic']); 

if(file_exists($pathToImage)==true){ 
    // Load the stamp and the photo to apply the watermark to 
    $stamp = imagecreatefrompng('tbwm.png'); 
    $im = imagecreatefromjpeg($pathToImage); 

    // Set the margins for the stamp and get the height/width of the stamp image 
    $marge_right = 10; 
    $marge_bottom = 10; 
    $sx = imagesx($stamp); 
    $sy = imagesy($stamp); 

    // Copy the stamp image onto our photo using the margin offsets and the photo 
    // width to calculate positioning of the stamp. 
    imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp)); 

    // Output and free memory 
    header('Content-type: image/png'); 
    imagepng($im); 
    imagedestroy($im); 
}else{ 
    header('Content-type: image/png'); 
    readfile('notfound.png'); 
} 
?> 

Ответить на комментарий:

Вы можете кэшировать изображение, добавив имя файла imagepng ($ IM, "new_image.png"); а затем проверьте, существует ли файл при последующих загрузках страниц, что не приведет к значительному ускорению вашего скрипта, но удвоит объем используемого дискового пространства.

+0

Знаете ли вы, что это увеличение производительности на моем сайте? Могу ли я увидеть фотографии с водяными знаками и показать их позже? – bizzr3

7

Вы сказали, что: /hotlinking/watermark.php ваш путь к файлу, так что я думаю, что ваш RewriteRule должен быть

RewriteRule (.*) /hotlinking/watermark.php?pic=$1 

И я думаю, что у вас есть ошибка при прямом доступе

http://192.168.1.190/hotlinking/watermark.php 

, потому что вы, кажется, чтобы не передать параметр pic.

Кстати:

а) я уверен, что вам придется изменить путь $ _GET [ «ПИК»] или функцию imagecreatefromjpeg не сможет открыть файл.

b) Если это не jpeg, вам придется изменить его с помощью другой функции. Вам нужно будет проверить тип изображения, прежде чем открывать его.

--- UPDATE ---

Хорошая RewriteRule является RewriteRule (.*) watermark.php?pic=$1

Теперь у вас есть файл watermark.php запрашивали. Вы должны изменить свой код. $ _GET ['pic'] сообщает вам, какой путь изображения был запрошен. Вам нужно будет изменить этот путь, чтобы открыть изображение.

Watermark.php находится в корневом каталоге, поэтому может быть только dirname(__FILE__) . $_GET['pic'].

<?php 
// Load the stamp and the photo to apply the watermark to 
$filepath = dirname(__FILE__) . $_GET['pic']; 
if (file_exists($filepath)) 
{ 

    $infos = pathinfo($filepath); 
    $im = null; 
    switch($infos['extension']) 
    { 
     case 'jpg' : 
     case 'jpeg' : 
      $im = imagecreatefromjpeg($filepath); 
      break, 
     case 'png' : 
      $im = imagecreatefrompng($filepath); 

     // .... 
    } 

    if ($im !== null) 
    { 
     $stamp = imagecreatefrompng('tbwm.png'); 
     // Set the margins for the stamp and get the height/width of the stamp image 
     $marge_right = 10; 
     $marge_bottom = 10; 
     $sx = imagesx($stamp); 
     $sy = imagesy($stamp); 

     // Copy the stamp image onto our photo using the margin offsets and the photo 
     // width to calculate positioning of the stamp. 
     imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp)); 

     // Output and free memory 
     header('Content-type: image/png'); 
     imagepng($im); 
     imagedestroy($im); 
    } 
} 

Это не полный сценарий, как начать. Вы сами должны выяснить остальное.

+0

, когда я использую этот путь 'RewriteRule (. *)/Hotlinking/watermark .php? pic = $ 1' ошибка 404 выглядит так: '/hotlinking/hotlinking/watermark.php не найден' – bizzr3

+1

Ваш .htaccess находится на локальном хосте или в каталоге« hotlinking »? – dievardump

+0

in/hotlinking root! – bizzr3