Laravel 5,将完整的URL作为路由参数

4

我需要在我的Laravel 5应用程序中将完整的URL作为路由参数传递,情况如下。我正在创建一个缩略图服务,它具有原始照片的URL,可以调整大小并将其流式传输回浏览器。例如,我需要img源具有以下src:

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

所以在控制器中,我可以像这样获取原始图像的 URL:

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

   dd($size, $original_url);

}

我的路由定义如下:

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

我已经按照这种方式做了,但服务器响应了一个 404 错误。
我在路由定义的 where 方法中也指定了一个 URL 模式。
有人知道如何做吗?

你的示例中 imgsrc 属性是有意为之的吗? - Derek Pollard
你在 sizeoriginal_url 之间加了一个斜杠,你试过在 300http 之间加一个斜杠吗? - microtony
@Sturm - 他正在将这些变量作为GET参数接受。它会起作用的。 - Derek Pollard
@microtony 是的,我的错误,我会编辑问题。 - asolenzal
@Sturm,这个URL是有效的,请看一下Thumbor用来生成缩略图的URL:http://162.248.55.45:8888/unsafe/300x300/https://www.entrenamiento.com/es/images/large.png - asolenzal
显示剩余2条评论
4个回答

9
你遇到的问题是 URL 参数默认使用斜杠 (/) 分隔。由于你的某个参数中包含斜杠,因此你遇到了特殊情况。
假设当前路由定义如下,并且 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', '.*');

这个 .* 约束将允许此参数接受任何字符,包括斜杠。但需要注意的是,这样做会导致此参数成为最后一个定义的参数,因为它会吞噬所有正斜杠,您将无法分隔任何其他路由参数。


谢谢,你救了我的一天。我尝试了另一个正则表达式,但没有成功,而你的却像预期的那样工作。再次感谢。 - asolenzal

2

像这样传递原始URL...

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

请注意,我已对路径使用urlencode以使其URL安全。
然后在您的控制器中,您可以简单地使用$original= Input::get('image');

1
我不知道你是否会重新访问这个问题,所以我只是想提醒你,你可以做到这一点,就像我在答案中展示的一样。个人而言,我可能也会选择使用GET参数的方式,但如果有人愿意,这也可以通过路径参数来实现。 - patricus
谢谢,我已经从我的回答中删除了错误信息。 - user1669496

1

如果您想生成:

<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


0
你需要做类似这样的事情:
<?php $url = sprintf('http://example.com/%s?image=%s', $size, url_encode($original_url); ?> 
<img src='{{ $url }}'>

url_encode() 函数将使 URL 安全地作为 GET 参数传递。

评论编辑:

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


那是简单的方法,一定有一种方法可以将完整的URL传递给路由。 - asolenzal
@asolenzal,我更新了我的问题,解释了为什么你的方法不起作用。 - Sturm
我会测试你的方法。谢谢。 - asolenzal
@asolenzal 很抱歉再次遗漏了一些信息,您 URL 中的任何 / 实例都会以同样的方式破坏它。仅删除 http:// 是不够的。您可以通过将每个斜杠替换为在 URL 其他位置不会发生的字符来解决这个问题,然后稍后撤消。我不确定您的限制是什么。 - Sturm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接