我需要在我的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模式。
有人知道该怎么做吗?
答案 0 :(得分:6)
您遇到的问题是默认情况下,url参数由正斜杠(/
)分隔。由于您的某个参数将包含正斜杠,因此会遇到特殊情况。
根据您当前的路线定义,并给出网址http://host.com/generate-thumb/300x300/http://host.com/images/media1.png
,您的size
参数获取300x300
,original_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'
]) }}"/>