我已经将用户头像上传到Laravel存储。如何访问它们并在视图中呈现它们?
服务器正在指向所有请求/public
,所以如果他们在/storage
文件夹中,我该如何显示?
欢迎各位兄弟 发布技术文章
这里的技术是共享的
47 19 | |
添加评论 |
81 | 在最好的方法是创建一个符号链接像@SlateEntropy相当不错,指出了下面的答案。为了帮助这个,从5.3版本开始,Laravel 包含一个令人难以置信的简单操作的命令:
从创建一个符号链接
如果由于任何原因,您无法创建符号链接(也许您在共享托管等),或者您想要保护某些访问控制逻辑背后的某些文件,则可以选择使用特殊的路由读取和提供图像。例如一个简单的闭包路由,如下所示:
现在,您可以像使用符号链接一样访问文件:
如果您使用干预图像库,您可以使用其内置
| |||
34 | 一个选择是在存储目录中的子文件夹和公用目录之间创建一个符号链接。 例如
这也是由所使用的方法Envoyer,泰勒Otwell,Laravel的开发者建立了一个部署管理器。 | ||||||||||||||||||||
|
7 | 如果你在Windows上可以运行cmd命令:
来自:http : //www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html | |||
3 | 根据Laravel 5.2文档,您可公开访问的文件应该放在目录中
为了让他们从网络访问,您应该创建符号链接
现在您可以在视图中使用资产助手创建文件的URL:
| ||
0 | 如果你使用php只是使用php syslink函数 将用户名和项目名称更改为正确的名称 | ||
感谢您对此问题的关注。因为它吸引了低质量或垃圾邮件的答案,必须删除,所以现在发布答案需要在这个网站10 声望(协会奖金不算)。
你想回答这些未回答的问题之一吗?
由SARATHISCOOKIE 发表于1年前
我需要在页面加载时查看配置文件图片。我已经使用laravel存储上传图像,但我不知道如何检索和查看图像。请检查我的下面的代码,并帮助我。
当前图像文件夹是storage / app / 1 / 1.jpeg
Laravel Code
public function index()
{
$id = Input::get('id');
User::findOrFail($id);
$file = Storage::get($id.'/'.$id.'.'.'jpeg');
return response($file, 200)->header('Content-Type', 'image/jpeg');
}
JS
<script>
$(function(){
$.post("/viewProfile/image", { id: 1 })
.done(function( data ) {
$('#responseImage').html('<img src="'+data+'">');
});
})
</script>
路线
Route::post('/viewProfile/image',[
'before' => 'csrf',
'as' => 'viewprofileimage',
'uses' => 'ProfileimageController@index']);
HTML
<div id="responseImage"> </div>
Blimey ...从哪里开始?
在控制器中,你只想返回文件路径?这是一个文本字符串,而不是一个图像/ jpg
如果您只是在浏览器中点击该路线,您是否可以获得图像路径?使用Postman(https://www.getpostman.com/),如果您需要生成一个帖子请求(但大多数只是代码Route::get(/viewProfile/image/{id})
)
(事实上你应该做的是模糊路径,以便有人不能抓住所有的个人资料图片 - 参见https://philsturgeon.uk/http/2015/09/03/auto-incrementing-to-destruction/ )
如果您实际在响应中流式传输图像,则可以使用内容类型标题。
这是一个单一的页面应用程序,您正在试图获得客户端的所有资产?你在使用一些框架吗?
或者,请看https://github.com/thephpleague/glide
默认情况下,这将从您的存储中渲染图像,并允许您进行各种各样的事情,如裁剪,颜色校正等。
@Snapey,我的firebug控制台显示响应。一些编码数据,如“ ?JFIF ????,?, C ” 状态为200 OK 190ms
@Snapey,我期待的形象。目前没有路径存储在数据库中。这是个问题吗?
我不认为你可以使用img src标签?
您将需要使用它作为内联数据和base64编码流
http://www.websiteoptimization.com/speed/tweak/inline-images/
请告诉我们您正在尝试什么,为什么这是Ajax调用?
@Snapey,我试图在ajax和laravel存储的帮助下查看配置文件图片
@Snapey,我会解释一下。它是一个用户个人资料页面。当用户登录系统时,他们可以查看他们的个人资料页面。例如用户ID为1.在我的代码中,我尝试将该用户ID“1”传递给控制器页面并获取特定用户的图像。用户图像存储在storage / app / 1 / 1.jpeg下。我认为这将会得到一个整体的想法。
好的,为什么你不把视图传递给图像的URL。
为了帮助,在你的UserController中创建一个函数;
public function getProfileImage(){
return Storage::get($this->id.'/'.$this->id.'.jpeg');
}
然后在你看来,只要做
name: { { $user->name } }
email: { { $user->email } }
photo: <img src="{ { $user->getProfileImage } }" />
(请注意,我不得不将论坛的大括号加倍空间)
@sarathiscookie将users
数据库表中的配置文件图片文件存储在名为avatar_filename
或类似的列中。然后,当用户上传它时,将实际的图像文件移动到可访问Web的目录,像public / img / avatar这样的地方。
获取用户时,您将获得文件名。所以如果我上传一个名为example.jpg的文件,那么路径将是public / img / avatars / example.jpg。所以在你看来,你可以这样做:
<img src="{{ asset('img/avatars/'.$user->avatar_filename) }}" alt="Avatar" />
您还需要确保文件名不会冲突,即如果两个用户上传具有相同文件名的配置文件图像。就个人而言,我使用uniqid()
PHP函数,并将其用作已上传图像的文件名。在配置文件图片的情况下,没有理由不能用用户的主键(即sha1($user->getKey())
)的哈希命名它们。这意味着您不会通过文件名来暴露用户的ID。
@Snapey,我的控制器页面是ProfileimageController.php。我已经创建了你所提到的功能。我如何获取<img标签?
嗨,我也面临同样的问题。Storage :: get不返回文件路径。它返回内容。如果内容出现如何处理图像,PDF等...
调节器
$path=Storage::get('pdf/a.jpg');
return view('test.view', compact('path'));
视图
<img src="{{ $path }}" >
@balasubramani存储不公开。您无法在那里保存文件,然后创建到它们的Web链接。这个线程是关于能够使用laravel拦截图像的调用,从私有存储获取它,并将文件流传输给客户端。
开始你自己的线程,你正在尝试做什么,以及你迄今做了什么。
感谢您的指导。
我想保护每个文件。所以只有我选择存储位置。获取文件内容的流式传输方式。
这是编程的正确方法。
调节器
$path=Storage::get('pdf/pdf.pdf');
查看文件
<embed width="100%" height="100%" src="data:application/pdf;base64,{{ base64_encode($path) }}">
感谢您的回复。
我不会建议您以这种方式尝试嵌入大型文件的内容。看看https://laravel.com/docs/5.2/responses#file-downloads
和
http://laravel.io/forum/04-23-2015-securing-filesimages
您需要做的是创建专门用于下载pdf的路线,然后通过视图中的链接引用该路线。
我这样做:
Route::get('/image/{path}/{file}', ['as'=>'image', 'uses'=>'ImageController@getImage']);
public function getImage($path,$file){
if($file){
$url = $path."/".$file;
}else{
$url = $path;
}
$path = storage_path("app/") . $url;
if(!File::exists($path)) abort(404);
$file = File::get($path);
$type = File::mimeType($path);
$response = Response::make($file, 200);
$response->header("Content-Type", $type);
return $response;
}
现在,我可以使用我的ACL这个路由或控制器内的其他条件规则。
来自 https://laracasts.com/discuss/channels/laravel/laravel-5-how-can-we-access-image-from-storage
public
目录中。这样,您将避免使用HTTP服务器更快地处理图像响应的开销。 - 博格丹 5月12日15时13分27分