以PHP为栗子,下午返回头像图片时遇到的一个问题,折腾了一段时间在同事帮助下解决了,感觉自己犯错挺蠢的也是这里不太熟悉,所以记录一下希望也能帮助到别人。
首先来看个栗子
var m = new Image()
undefined
m.src = 'http://127.0.0.1:8000/image/avatar/3_small.jpg'
"http://127.0.0.1:8000/image/avatar/3_small.jpg"
m.src='http://inte-service.static.chanjet.com/avatars/000/00/00/20190809015513.jpg'
"http://xxxxxxxxxxxxx.com/avatars/000/00/00/20190809015513.jpg"
有两个图片的URL,一个是通过本地图片的路径,一个是图片服务器的url路径,而第一张图片时无法下载图片的,而第二张是可以下载的,主要的差别在于
![](https://img.haomeiwen.com/i7869796/75685e6b778859fa.png)
![](https://img.haomeiwen.com/i7869796/35cf96b0987996c2.png)
本地如果Response没有做处理的话是以text字符串来处理的不会以图片流形式下载的,而图片服务器返回的是图片流的格式。
而我遇到的是在Laravel框架在通过路由返回的问题 看下代码
<img class="user-head" alt="{{ $hotArticle->user->name }}" src="{{ get_user_avatar($hotArticle->user_id,'small') }}">
通过一个方法调用路由
if(! function_exists('get_user_avatar')){
function get_user_avatar($user_id,$size='middle',$extension='jpg'){
return route('website.image.avatar',['avatar_name'=>$user_id.'_'.$size.'.'.$extension]);
// return route('website.image.avatar',['avatar_name'=>$user_id]);
}
}
Controller方法
$avatar = User::find($avatar_name);
if($avatar) {
return $avatar['avatar'];
}else {
return 404;
}
这样子是错误的,因为通过路由请求最后返回的response 是带Content-Type的,及时url是资源服务器也是以text/html,不会下载
正确的方法:
$avatar = User::find($avatar_name);
if($avatar) {
$image = Image::make($avatar['avatar']);
$response = response()->make($image->encode('jpg'));
$response->header('Content-Type', 'image/jpeg');
return $response;
}else {
return 404;
}
网友评论