-4

我想编写一个简单的 Web 服务(我并不特别关注语言实现),它在 Nearfreespeech.net 的 FreeBSD Web 服务器上运行,它接受一个指向 JPEG 图像的 URL,该 URL 带有一些附加参数,如下所示:

http://www.myserver.com/script.cgi?url=http://www.destination.com/image.jpg&width=320

并执行以下操作:

  1. 如何解析 URL 的参数?(目标 URL 加上一些额外的参数进行处理)
  2. 如何在参数中提供的 URL 中获取图像的内容?
  3. 根据附加参数,对内容进行一些处理(超出本题范围)
  4. 如何返回处理后的图像以正确识别为要在浏览器中显示的图像(而不是返回文本)?

我认为这对于像 Perl 这样的脚本语言来说并不难,但我不知道从哪里开始步骤 1、2 和 4。

4

5 回答 5

1

我最近一直在研究 PHP 爬虫,所以我对其中一些问题相当熟悉。

对于这些问题,我建议以下解决方案:

  1. 您可以使用 $_GET 或 $_POST 轻松获取参数。如果需要获取 URL 的其他部分,可以使用 parse_url()

  2. 虽然 file_get_contents() 可以工作,但 cURL 是一个更加复杂和强大的解决方案。

  3. cURL 可以返回一个文件句柄,其中包含已下载的任何文件,并且可以在此时对其进行处理。

  4. 然后您可以使用 fwrite() 将文件内容写入本地文件

于 2012-08-17T19:52:34.227 回答
1

您提供的 url 无效,但您可以对查询字符串进行编码,例如: http ://www.myimageserver.com?url=http%3a%2f%2fwww.flickr.com%2fsomeimage.jpg%2f320%2f200 (此处为flickr url 是 urlencoded,您可以在这里在线尝试 urlencoding:http : //www.opinionatedgeek.com/DotNet/Tools/UrlEncode/Encode.aspx

  1. 使用php,可以获取url的参数。要在 php 中访问“http://www.flickr.com/someimage.jpg/320/200”,您只需使用:

    $url = $_GET['url']; // 将 $url 设置为字符串:“http://www.flickr.com...”

    // ... 解析可以在这里完成

  2. 要获取 url 的内容:

    $url_content = file_get_contents($url);

  3. 现在您可以进行处理了。

  4. 要返回输出,您可以使用 echo:

    回声 $processed_content;

于 2012-08-17T19:13:11.823 回答
0

这是一个示例,仅适用于 jpeg 图像。

<?
$url = $_GET['url'];

$im = imagecreatefromjpeg($url);
header("Content-Type: image/jpeg");

for($i=0;$i<100;$i++)
{
    for($j=0;$j<100;$j++)
    {
        if(rand(0,1))
        {
            $rand = rand(0,4);
            imagesetpixel($im,$i,$j,imagecolorallocate($im, 255, 255, 255));
        }
    }
}

imagejpeg($im);
?>
于 2012-08-17T19:02:30.583 回答
0

我喜欢 python 来做这种事情。具体来说,位于 WSGI 服务器上的 Python WSGI 应用程序应该适合您的应用程序。

Python 带有一个“简单的服务器”,您可以在其上进行测试。对于部署,您可能希望找到第三方 WSGI 服务器,例如 CherryPy 的 WSGI 服务器或 Rocket(两者都完全在 python 中实现)。

如果可能的话,我会推荐 python 3.2,因为 GIL 更好,这对多线程 WSGI 服务器有影响,比如我提到的 CherryPy 和 Rocket。

阅读 WSGI 以获取更多信息。在 Python 站点 e,PEP 333 和 3333。

于 2012-08-17T19:04:35.400 回答
0

下面是我在 Perl 中的做法:

#!/usr/bin/perl
use CGI qw(:standard);
use IO::Handle;
use LWP::Simple;
use File::Temp;
use File::Slurp;

$url = param('url');
$width = param('width');
$height = param('height');
$content = get($url);

$in = File::Temp->new( SUFFIX => '.jpg' );
print $in $content;

$out = File::Temp->new( SUFFIX => '.jpg' );
system("convert $in -resize $width" . "x" . "$height $out");

my $q = new CGI;
print $q->header( - type => "image/jpeg", -expires => "-1d" );

$content2 = read_file($out);
print $content2;
于 2012-08-18T02:50:05.233 回答