Laravel 5,有完整的url作为路由参数

时间:2016-02-08 16:16:08

标签: php laravel laravel-5

我需要在我的laravel 5应用程序上传递一个完整的url作为路由参数,事情如下。我正在创建一个缩略图服务,让原始照片的网址调整大小并将其流回浏览器。 例如,我需要img源代码有这样的src:

import flickrapi

api_key = "xxxxxxxxxxxxxxxxxxxxx"
secret_api_key = "xxxxxxxxxx"
flickr = flickrapi.FlickrAPI(api_key, secret_api_key)

def obtainImages3():

    group_list = flickr.groups.search (api_key=api_key, text = 'Paris', per_page = 10)

    for group in group_list[0]:

        group_images = flickr.groups.pools.getPhotos (api_key=api_key, group_id = group.attrib['nsid'], extras = 'geo, tags, url_s')

        for image in group_images[0]:
        url = image.attrib['url_s']
        tags = image.attrib['tags']

        if image.attrib['geo'] != 'null':

            photo_location = flickr.photos_geo_getLocation(photo_id=image.attrib['id'])
            lat = float(photo_location[0][0].attrib['latitude'])
            lon = float(photo_location[0][0].attrib['longitude'])

所以在控制器中我可以得到这样的原始图像网址:

<img src="http://host.com/generate-thumb/300x300/http://host.com/images/media1.png"/>

我的路线定义如下:

public function thumbAction(Request $request, $size, $original_url){

   dd($size, $original_url);

}

我这样做了,但服务器响应404错误。

我还在路由定义的Route::get('/generate-thumb/{size}/{original_url}', array( 'as' => 'thumb_hook', 'uses' => 'ThumbController@thumbAction' )); 方法中指定了一个url模式。

有人知道该怎么做吗?

4 个答案:

答案 0 :(得分:6)

您遇到的问题是默认情况下,url参数由正斜杠(/)分隔。由于您的某个参数将包含正斜杠,因此会遇到特殊情况。

根据您当前的路线定义,并给出网址http://host.com/generate-thumb/300x300/http://host.com/images/media1.png,您的size参数获取300x300original_url参数获取http:会发生什么,然后有一堆更多的参数。由于您没有这样定义的路线,因此您将获得404。

为了允许参数接受正斜杠,您需要为该参数定义正则表达式约束。你需要像这样定义你的路线:

Route::get('/generate-thumb/{size}/{original_url}', array(
        'as' => 'thumb_hook',
        'uses' => 'ThumbController@thumbAction'
    ))
    ->where('original_url', '.*');

.*约束将允许此参数接受任何字符,包括正斜杠。请注意,执行此操作时,此参数将需要是最后定义的参数,因为它会占用所有正斜杠,并且您将无法分隔任何其他路径参数。

答案 1 :(得分:2)

像这样传递原始网址......

<img src="http://host.com/generate-thumb/300x300?image=http%3A%2F%2Fhost.com%2Fimages%2Fmedia1.png"/>

请注意,我在路径上使用了urlencode,以确保网址安全。

然后在您的控制器中,您只需使用$original= Input::get('image');

即可

答案 2 :(得分:0)

你需要做这样的事情:

<?php $url = sprintf('http://example.com/%s?image=%s', $size, url_encode($original_url); ?> 
<img src='{{ $url }}'>

url_encode()可以安全地将该网址作为GET参数传递。

编辑评论:

由于Laravel解析URL及其参数的方式,这不起作用。它看到300x300/http://并找到一个空参数。如果您可以删除http://并且仍然具有您的功能,那么它将正常工作。 urlencode无法解决此问题。

答案 3 :(得分:0)

如果你想生成:

<img src="http://host.com/generate-thumb/300x300/http://host.com/images/media1.png"/>

使用route()助手,然后传递数组以获取参数。

Route.php

 Route::get('/generate-thumb/{size}/{original_url}', array(
       'as' => 'thumb_hook',
       'uses' => 'ThumbController@thumbAction'
    ));
刀片文件上的

<img src="{{ route('thumb_hook',[ 
    'size' => '300x300' ,
    'original_url' => 'http://host.com/images/media1.png'
 ]) }}"/>

https://laravel.com/docs/5.1/helpers#method-route