PDA

View Full Version : سوال: نحوه گرفتن تصاویر از طریق یه سرور واسط؟



se8820726
یک شنبه 05 آذر 1391, 21:24 عصر
سلام
آقا من میخوام یه برنامه ای بنویسم که وقتی یه url تصویر بهش میدیم بره اون تصویر رو از تو url بگیره و برای client بفرسته؟

در واقع میخوام تصاویر رو از طریق یه سرور واسط بگیرم

لطفا راهنمایی کنید

MMSHFE
یک شنبه 05 آذر 1391, 22:20 عصر
با GD خیلی راحت میشه. اگه هاستتون خارج از کشور باشه، میتونید مسئله ف-ی-ل-ت-ر-ی-ن-گ رو هم رد کنید. اگه تمایل داشتین، بگین تا روشش رو توضیح بدم.

se8820726
یک شنبه 05 آذر 1391, 22:27 عصر
بله لطفا روششو توضیح بدین

MMSHFE
یک شنبه 05 آذر 1391, 23:14 عصر
<?php
if(isset($_GET['url'])) {
$url = $_GET['url'];
$file = array_reverse(explode('/', $url));
$file = pathinfo($file[0], PATHINFO_EXTENSION);
switch(strtolower($file)) {
case 'bmp':
$im = imagecreatefromwbmp($url);
header('Content-Type: image/bmp');
imagewbmp($im);
imagedestroy($im);
break;
case 'gif':
$im = imagecreatefromgif($url);
header('Content-Type: image/gif');
imagegif($im);
imagedestroy($im);
break;
case 'jpg':
$im = imagecreatefromjpeg($url);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
break;
case 'png':
$im = imagecreatefrompng($url);
imagesavealpha($im, true);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
break;
}
}
?>

rezaonline.net
یک شنبه 05 آذر 1391, 23:18 عصر
توی یه فایل بذار به اسم test.php
آدرس بده
test.php?img=http://site.ir/pic.jpg


if(empty($_GET['img']))
die;

function LoadJpeg($imgname)
{
/* Attempt to open */
$im = @imagecreatefromjpeg($imgname);

/* See if it failed */
if(!$im)
{
/* Create a black image */
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);

imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

/* Output an error message */
imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
}

return $im;
}

header('Content-Type: image/jpeg');
$file_img = file_get_contents($_GET['img']);
$img = LoadJpeg($file_img);

imagejpeg($img);
imagedestroy($img);

se8820726
دوشنبه 06 آذر 1391, 02:25 صبح
این کدی که شما بالا نوشتین باید حتما یه درخواست به صورت get فرستاده بشه اما هدف اصلی من اینه:
تو قسمت src تگ های img من نوشته: (http://pcdn.500px.net/19043283/f9b11360a5e16ad6ccde09eca144c05418dd18f0/4.jpg)
من تو سرورم این ادرس رو با آی دی 19043283 توپایگاه داده ذخیره کردم. و توی src این رو گذاشتم: (http://myserver/500px/test.php?id=19043283) و فرستادم واسه کلاینت
حالا این اسکریپتی که بالا نوشتین رو چه تغییراتی باید بدم که عکس ها سمت کلاینت باز بشند؟ یعنی در حالت عادی وقتی یه صفحه واسه کلاینت مفرستی که توش یه تگ img داره. کلاینت واسه گرفتن عکسی که تو قسمت src ادرسش وارد شده واسه سرور مورد نظر چه جور درخواستی میفرسته؟ آیا درخواست از نوع post یا get میفرسته؟ یا نه سرور وقتی صفحه رو میفرسته همه عکس هارم باهاش میفرسته؟

se8820726
دوشنبه 06 آذر 1391, 15:57 عصر
لطفا دوستان راهنمایی کنند

tux-world
دوشنبه 06 آذر 1391, 21:28 عصر
تست نکردم ولی باید بشه مثل کپچا ها باهاش رفتار کرد:

<img src=' test.php?img=http://site.ir/pic.jpg' />
تست نکردم ها!!!

se8820726
سه شنبه 07 آذر 1391, 02:22 صبح
توی یه فایل بذار به اسم test.php
آدرس بده
test.php?img=http://site.ir/pic.jpg


if(empty($_GET['img']))
die;

function LoadJpeg($imgname)
{
/* Attempt to open */
$im = @imagecreatefromjpeg($imgname);

/* See if it failed */
if(!$im)
{
/* Create a black image */
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);

imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

/* Output an error message */
imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
}

return $im;
}

header('Content-Type: image/jpeg');
$file_img = file_get_contents($_GET['img']);
$img = LoadJpeg($file_img);

imagejpeg($img);
imagedestroy($img);




<?php
if(isset($_GET['url'])) {
$url = $_GET['url'];
$file = array_reverse(explode('/', $url));
$file = pathinfo($file[0], PATHINFO_EXTENSION);
switch(strtolower($file)) {
case 'bmp':
$im = imagecreatefromwbmp($url);
header('Content-Type: image/bmp');
imagewbmp($im);
imagedestroy($im);
break;
case 'gif':
$im = imagecreatefromgif($url);
header('Content-Type: image/gif');
imagegif($im);
imagedestroy($im);
break;
case 'jpg':
$im = imagecreatefromjpeg($url);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
break;
case 'png':
$im = imagecreatefrompng($url);
imagesavealpha($im, true);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
break;
}
}
?>


هیچ کدوم از این اسکریپت ها جواب نداد
لطفا دوستان متخصص تست کنن و جواب بدن


با GD خیلی راحت میشه. اگه هاستتون خارج از کشور باشه، میتونید مسئله ف-ی-ل-ت-ر-ی-ن-گ رو هم رد کنید. اگه تمایل داشتین، بگین تا روشش رو توضیح بدم.

این GD چیه؟ لطفا در موردش بیشتر توضیح بدین

mtchabok
سه شنبه 07 آذر 1391, 13:19 عصر
این کدی که شما بالا نوشتین باید حتما یه درخواست به صورت get فرستاده بشه اما هدف اصلی من اینه:
تو قسمت src تگ های img من نوشته: (http://pcdn.500px.net/19043283/f9b11360a5e16ad6ccde09eca144c05418dd18f0/4.jpg)
من تو سرورم این ادرس رو با آی دی 19043283 توپایگاه داده ذخیره کردم. و توی src این رو گذاشتم: (http://myserver/500px/test.php?id=19043283) و فرستادم واسه کلاینت
حالا این اسکریپتی که بالا نوشتین رو چه تغییراتی باید بدم که عکس ها سمت کلاینت باز بشند؟ یعنی در حالت عادی وقتی یه صفحه واسه کلاینت مفرستی که توش یه تگ img داره. کلاینت واسه گرفتن عکسی که تو قسمت src ادرسش وارد شده واسه سرور مورد نظر چه جور درخواستی میفرسته؟ آیا درخواست از نوع post یا get میفرسته؟ یا نه سرور وقتی صفحه رو میفرسته همه عکس هارم باهاش میفرسته؟

سلام
شما در ابتدا در فایل text.php که توسط id شماره شناسایی عکستون رو گرفتین ، از دیتابیس آدرس عکس رو در بیارید و در متغیر url کد زیر که دوستمون نوشتن قرار بدین .

$url = $address; // آدرس عکس
$file = array_reverse(explode('/', $url));
$file = pathinfo($file[0], PATHINFO_EXTENSION);
switch(strtolower($file)) {
case 'bmp':
$im = imagecreatefromwbmp($url);
header('Content-Type: image/bmp');
imagewbmp($im);
imagedestroy($im);
break;
case 'gif':
$im = imagecreatefromgif($url);
header('Content-Type: image/gif');
imagegif($im);
imagedestroy($im);
break;
case 'jpg':
$im = imagecreatefromjpeg($url);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
break;
case 'png':
$im = imagecreatefrompng($url);
imagesavealpha($im, true);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
break;
}

se8820726
چهارشنبه 08 آذر 1391, 19:48 عصر
سلام دوستان
با توجه به مطالب بالا این کد رو نوشتم ولی بازم کار نکرد

test.html:


<img src="test2.php?img=http://localhost/img/a.jpg">


test2.php:


<?php
ob_start();
if (isset($_GET['img'])) {
$im = imagecreatefromjpeg($_GET['img']);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
}
ob_end_flush();
?>


لطفا دوستان راهنمایی کنند

MMSHFE
پنج شنبه 09 آذر 1391, 14:54 عصر
دوست عزیز، اینکه میگین کار نکرد خیلی کلیه! لطفاً دقیقاً بگین چه خروجی گرفتین؟ صفحه سفید اومد؟ خطا اومد؟ توی آدرس بار مرورگرتون بنویسید test2.php?img=http://localhost/img/a.jpg و ببینید چی اجرا میشه؟

hidensoft
پنج شنبه 09 آذر 1391, 20:15 عصر
آقا واقعا نیاز به GD نیست !
http://php.net/manual/en/function.fsockopen.php
http://www.php.net/manual/en/function.file-get-contents.php
http://www.php.net/manual/en/book.curl.php

MMSHFE
پنج شنبه 09 آذر 1391, 20:32 عصر
دوست عزیز GD برای امنیت بیشتر هست تا اگه احیاناً کدهایی توی تصویر Inject شده باشه، از بین بره. ضمناً سوکت و cURL همه جا در دسترس نیست. file_get_contents روش خوبیه ولی کدهای Inject شده رو هم میخونه.

se8820726
جمعه 10 آذر 1391, 00:16 صبح
سلام

آقا هیچ اروری نمیده یه صفحه سفید میاد.

از صفحه یه عکس گرفتم.

توی آدرس بار مرورگر هم زدم بازم همونجور شد.

در هردو حالت تصویر زیر رو بهم داد.

http://upcity.ir/images/93849449299732902358.jpg

MMSHFE
جمعه 10 آذر 1391, 00:26 صبح
دوست گرامی، توی مرورگر آدرس فایل test2.php?img=http://localhost/img/a.jpg رو بنویسید (قبلش http://localhost یادتون نره) و ببینید چی میاد. اگه صفحه سفید اومد یا پیغام خطا اومد، (...'header('Content-Type رو حذف کنید و پیغام خطا رو بنویسید.

se8820726
جمعه 10 آذر 1391, 05:37 صبح
وقتی تو مرورگر آدرسی که گفتین رو زدم دوباره یه صفحه مثل همون تصویری که تو پست قبلیم گذاشته بودم رو داد.
وقتی دستور header رو پاک کردم این صفحه رو بهم داد:

http://upcity.ir/images/57748602845544122549.jpg

Tarragon
جمعه 10 آذر 1391, 06:28 صبح
آقا مطمئنید آدرس عکسی که دادید درسته من الان همین رو چک کردم کار کرد
این کد یکم از قبلی کامل تره و عکس های png و gif رو هم پشتیبانی می کنه

<?php
ob_start();
if (isset($_GET['img'])) {
$a = substr(strrchr($_GET['img'],'.'),1);
if($a == 'jpg' or $a == 'jpeg'){
$im = imagecreatefromjpeg($_GET['img']);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
}
elseif($a == 'png'){
$im = imagecreatefrompng($_GET['img']);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
}
elseif($a == 'gif'){
$im = imagecreatefromgif($_GET['img']);
header('Content-Type: image/gif');
imagegif($im);
imagedestroy($im);
}

}
ob_end_flush();
?>

se8820726
جمعه 10 آذر 1391, 06:37 صبح
از تمام دوستان بابت پاسخ هاشون متشکرم
بالاخره مشکل حل شد.
مشکل تو کدنویسی نبود بلکه تو encoding صفحه بود. صفحه من تو قالب UTF8 ذخیره شده بود و من باید اونو در قالب ANSI ذخیره میکردم.
با تغییر encoding به ANSI مشکل نمایش تصاویر حل شد

MMSHFE
جمعه 10 آذر 1391, 08:25 صبح
خوب خدا رو شکر. البته با ذخیره بصورت UTF-8 without BOM هم مشکل رفع میشد.

se8820726
جمعه 10 آذر 1391, 18:27 عصر
ممنون. ولی ببخشید حالا یه مشکل دیگه برخوردم.
تو سیستم خودم همه چی خوب کار میکنه
اما وقتی تو سرور دستور رو میدم این error رو میده:
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: URL file-access is disabled in the server configuration in /home/persia23/public_html/retrieve.php on line 6

خوب گویا من نمیتونم یه آدرس خارج از سرور رو تو imagecreatefromjpeg() وارد کنم. چون قابلیتشو تو فایل php.ini سرور بستن.
خوب تو اینترنت 3تا راه دیدم.
یکی با curl
یکی هم اینکه تو root هاستم بیام php.ini بسازم و htaccess. رو دستکاری کنم.
راه سومم یادم نیست.

لطفا دوستان کمک کنند که بهترین روش چیه و کدش چجوری میشه

فقط خواهشا نگین که برو به admin بگو قابلیتو باز کنه که اصلا نمیشه